session與cookie的作用都是為了保持訪問使用者與後端伺服器的互動狀態。
使用cookie來傳遞資訊時,隨著cookie個數的增多和訪問量的增加,它占用的網路頻寬也很大,試想假如cookie占用200個位元組,如果一天的pv有幾億,它要占用多少頻寬?所以有大訪問量的時候希望用session,但是session的缺點是不容易在多台伺服器之間共享,所以這也就限制了session的使用。
通俗地說就是當乙個使用者通過http協議訪問乙個伺服器的時候,這個伺服器會將一些key/value鍵值對返回給客戶端瀏覽器,並給這些資料加上一些限制條件,在條件符合是這個使用者下次訪問這個伺服器的時候,資料又被完整地帶回給伺服器。
這個作用就像你去超市購物時,第一次給你辦張購物卡,這個購物卡里存放了一些你的個人資訊,下次你再來這個連鎖超市時,超市會識別你的購物卡,下次直接購物就好了。
由於http協議是一種無狀態協議,當使用者的一次訪問請求結束後,後端伺服器就無法知道下一次來訪問的還是不是上次訪問的使用者。在乙個很短的時間內,如果有使用者相關的資料被頻繁訪問,可以針對這個資料做快取,這樣可以大大提高資料的訪問效能。cookie的作用正是在此,由於是同乙個客戶端發出的請求,每次發出的請求都會帶有第一次訪問時服務端設定的資訊,這樣服務端就可以根據cookie值來劃分訪問的使用者了。
cookie是http協議頭中的乙個字段,雖然http協議本身對這個欄位並沒有多少限制,但是cookie最終還是儲存在瀏覽器裡,所以不同的瀏覽器對cookie的儲存都有一些限制。
同乙個客戶端每次與服務端互動時,不需要每次都回傳所有的cookie值,而是只要傳回乙個id,這個id是客戶端第一次訪問伺服器的時候生成的,而且每個客戶端是唯一的。這樣每個客戶端就有了唯一的id,客戶端只要傳回這個id就行了,這個id通常是name為jsesionid的乙個cookie。
有了session id服務端就可以建立httpsession物件了,第一次觸發通過request.getsession()方法。如果當前的session id還沒有對應的httpsession物件,那麼就建立乙個新的,並將這個物件加到org.apache.catalina.manager的sessions容器中儲存。manager類將管理所有session的生命週期,session過期將被**,伺服器關閉,session將被序列化到磁碟等。只要這個httpsession物件存在,使用者就可以根據session id來獲取這個物件,也就達到了狀態的保持。
雖然cookie和session都可以跟蹤客戶端的訪問記錄,但是它們的工作方式顯然是不同的,cookie通過把所有要儲存的資料通過http協議的頭部從客戶端傳遞到服務端,又從服務端在傳回客戶端,所有的資料都儲存在客戶端的瀏覽器裡,所以這些cookie資料可以被訪問到,所以cookie的安全性受到了很大的挑戰。
相比較而言session的安全性要高很多,因為session是將資料儲存在服務端,只是通過cookie傳遞乙個sessionid而已,所以session更適合儲存使用者隱私和重要的資料。
深入理解session和cookie
理解乙個東西首先要知道它的由來,也就是為什麼會需要它,它的作用是什麼。cookie 隨著web的不斷發展,需求也在不斷的變化,從最初的全靜態頁面到後面的動態頁面。因為http協議是乙個無狀態的協議,當使用者的一次訪問結束後,後端伺服器就無法知道下一次來訪問的還是不是上一次訪問的使用者。由此w3c組織...
深入理解session過期機制
首先得明白 session的過期時間由兩方面決定的 1儲存在客戶端的 cookie phpsessid 的過期時間 預設cookie名稱為phpsessid,可通過php.ini中的session.name修改。2.儲存在伺服器端的相對應的session檔案 session檔名和上述cookie的值...
深入理解javscript(10) this
參考 接著上一節講的話,應該輪到 執行上下文棧 了,但是這裡不得不插入一節,把this說一下。因為this很重要,js的面試題如果不出幾個與this有關的,那出題者都不合格。其實,this的取值,分四種情況。我們來挨個看一下。在此再強調一遍乙個非常重要的知識點 在函式中this到底取何值,是在函式真...