概念理解
1. 無狀態HTTP協議
協議是指兩臺計算機之間進行通訊所必須共同遵守的規定或規則,HTTP(超文字傳輸協議)是一種通訊協議,它允許將HTML(超文字標記語言)文件從WEB伺服器傳送到客戶端瀏覽器。
HTTP協議是無狀態協議,一旦資料交換完畢,客戶端與伺服器的連線就會關閉,再次交換資料需要建立新的連線,這就意味著伺服器無法從連線上跟蹤會話。
2. 會話跟蹤
會話指使用者登入網站後的一系列動作。比如:瀏覽商品新增到購物車併購買。
會話跟蹤是WEB程式中常用的技術,用來跟蹤使用者的整個會話,常用的技術是:Cookie和Session。
Cookie通過客戶端記錄資訊確定使用者身份,Session通過在伺服器端記錄資訊確定使用者身份。
3. Session
session是一種記錄客戶狀態的機制,session儲存在伺服器上。客戶端瀏覽器訪問伺服器的時候,伺服器把客戶端資訊以某種形式記錄在伺服器上,這就是session。 客戶端瀏覽器再次訪問時只需要從該session中查詢該客戶的狀態就可以了。
當程式需要為某個客戶端的請求建立一個session時,伺服器首先檢查這個客戶端的請求裡是否包含了sessionId:
-
如果已包含,則說明以前已經為此客戶端建立過session,伺服器就按照sessionId把這個session檢索出來使用(檢索不到,會新建一個)
-
如果客戶端請求不包含sessionId,則為此客戶端建立一個session並且生成一個與此session相關聯的sessionId,sessionId的值是一個既不會重複,又不容易被找到規律以仿造的字串,這個sessionId將被在本次響應中返回給客戶端儲存。
-
如果客戶端禁用了cookie,通常有兩種方法實現session而不依賴cookie。
<1>URL重寫,將是把sessionId直接附加在URL路徑後面。
<2>表單隱藏欄位,就是伺服器會自動修改表單,新增一個隱藏欄位,以便在表單提交時能夠把sessionId傳遞迴伺服器。
4. Cookie
由於HTTP是一種無狀態的協議,伺服器單從網路連線上無從知道客戶身份
舉例: A使用者買了一件商品放入購物車內,當再次購買商品時,伺服器已經無法判斷該購買行為是屬於A使用者的會話還是B使用者的會話了,怎麼辦?
解決辦法:
給客戶端們頒發一個通行證,每人一個,無論誰訪問都必須攜帶自己的通行證,這樣伺服器就能從通行證上確定客戶身份了,這就是Cookie的工作原理。
cookie實際上是一小段的文字資訊,客戶端請求伺服器,如果伺服器需要記錄該使用者狀態,就使用response向客戶端瀏覽器頒發一個cookie,客戶端瀏覽器會把cookie儲存起來,當瀏覽器再次請求網站時,瀏覽器把請求的網址連同該cookie一同提交給伺服器,伺服器檢查該cookie,以此來辨認使用者狀態,伺服器還可以根據需要修改cookie的內容。
cookie分為兩大類:
- 會話cookie:不設定過期時間,瀏覽器關了,會話cookie就消失了,儲存在記憶體中。
- 持久化cookie:設定了過期時間,持久化儲存在客戶端硬碟中。
cookie具有不可跨域名性: 就是說,瀏覽器訪問百度不會帶上谷歌的cookie。
檢視某個網站頒發的Cookie(需要連上網才行):在瀏覽器位址列輸入:javascript:alert(document.cookie)
session與cookie的區別
- session是儲存在服務端的,客戶端不知道其中的資訊,cookie是儲存在客戶端的,服務端可以知道其中的資訊,所以session的安全性要高於cookie。
- session中儲存的是物件,cookie中儲存的是字串。
- session不能區分路徑,同一個使用者在訪問一個網站期間,所有的session在任何一個地方都可以訪問到;而cookie中如果設定了路徑引數,那麼同一個網站中不同路徑下的cookie相互是訪問不到的。
- 我們獲取的session裡的資訊是通過存放在會話cookie裡的sessionId獲取的。
- 因為session是存放在伺服器裡的,所以session裡的東西不斷增加會增加伺服器的負擔,我們會把一些重要的東西放在session裡,不太重要的放在客戶端cookie裡。
session與cookie的聯絡
session是需要藉助cookie才能正常工作的,如果客戶端完全禁止cookie,session將失效。
相關問題整理
-
什麼東西可以讓你每次請求都把sessionId自動帶到伺服器呢?
答:是cookie,如果你想為使用者建立一次會話,可以在使用者授權成功時給他一個唯一的cookie。
當一個使用者提交了表單時,瀏覽器會將使用者的sessionId自動附加在HTTP頭資訊中(瀏覽器自動功能,使用者不會察覺到),當伺服器處理完這個表單後,將結果返回給sessionId所對應的使用者。
試想如果沒有sessionId,當有兩個使用者同時進行註冊時,伺服器怎麼才能知道到底是哪個使用者提交了表單呢。