首先為了能充分理解為什麼引入cookie和cookie是什麼,先看了例子。不然官網上定義的概念不太容易看懂。
eg:我今天想找老王吃放,打**給老王
例子看完了,在看看一些官網上一些專業術語的定義。
會話:由一組請求和響應組成(理解為上面例子中的「對話」),是圍繞著一件相關事情(「吃飯」)所進行的請求和響應。這些請求響應之間一定是需要有資料傳輸的(「每次對話的時候都應該知曉上次的內容」)。即是需要進行會話狀態跟蹤(想等於會話資料傳輸)。
為什麼要引入cookie?
上面說了會話是具備會話狀態跟蹤的,然而網上的請求和響應一般都是http協議,它是中無狀態協議,在不同的請求間是無法進行資料傳輸的。那麼要進行網路會話狀態跟蹤怎麼做呢?這就引進了cookie。
什麼是cookie?
cookie由伺服器生成,儲存在客戶端的一種資訊載體。最簡單的網上乙個例子,京東購物網不登入的時候可以將商品加入購物車,本機關閉瀏覽器再開啟瀏覽器進入京東頁面,購物車裡面資料依舊在,只要不刪除cookie或cookie沒有失效,那麼購物車資料都在。當然換台電腦肯定就沒有了,說明其實cookie的資料是存在本地瀏覽器快取中的資料。
cookie怎麼生成的?
使用者第一次提交請求後,伺服器就會生成cookie,並將其封裝到響應頭中,以響應的方式傳送給客戶端。客戶端受到這個響應之後,將cookie儲存到客戶端。客戶端再次傳送同類請求後,在請求中會攜帶儲存在客戶端中的cookie資料,由伺服器會話進行跟蹤。
session,即會話,從技術面角度來看跟cookie都是一樣,都是web開發中的一種會話狀態跟蹤技術。
session和cookie不同的是,cookie是將會話狀態(會話狀態可以理解為就是會話之間的資料)儲存在客戶端,而session是將會話狀態儲存在服務端。
為什麼需要session?
cookie將資料儲存在客戶端,也就是我們本地電腦的瀏覽器中,清空cookie或者換一台電腦之後這些資料就沒有了。那如果使用者登入了儲存的購物資訊,不僅僅是要在本機電腦能看到,用別的電腦登入使用者名稱也要看到之前保留的購物車資訊。之前cookie只能把資料儲存在瀏覽器快取中,那麼怎麼解決只要使用者登入了,別的電腦也能檢視之前資料,這就引進了session。
總結:當客戶第一次提交請求時,伺服器會生成乙個32位的隨機字串jsessionid和乙個session,並以這個jsessionid作為key,以session作為value放在map.entry中作為session列表,同時伺服器會把這個32位的jsessionid包裝成乙個cookie傳送給客戶端。客戶端拿到這個cookie把它存到瀏覽器快取中,然後客戶端又傳送一次請求,這次請求發出的時候就會攜帶快取中32位的jsessionid傳送給伺服器,伺服器接收到這個jsessionid以後,會從之前的session列表(是乙個map)根據key=jsessionid去找,找到了之後就可以拿到session裡面的資訊資料了。
**整個session工作原理可以分為四步:**
(1) 寫入session列表:客戶第一次提交請求,會生成乙個以jsessionid和乙個session,存入到session列表中(map);
(2) 伺服器生成並傳送cookie。session資訊寫入到session列表之後,系統會自動將jsessionid作為name,以cookie的形式存放在響應報頭中,伺服器將cookie傳送到客戶端
(3) 客戶端接收並傳送cookie。客戶端接收到cookie之後會將其放入到瀏覽器快取中,只要客戶端瀏覽器不關閉,瀏覽器快取中的cookie就不會消失。使用者第二次請求會將快取中的cookie伴隨頭部資訊傳送給伺服器
(4) 從session列表中查詢。伺服器接收到客戶端傳送過來的cookie中的jsessionid之後,就去session列表中根據key查詢,查詢到了就返回session資料。
web開發中引入了session超時的概念,例如我們126郵箱可以選擇預設10天登入,那麼session失效時間就是10天,10天之後又要重新勾選登入。當然也有的**session預設設定為30分鐘。
如何使用:
之前我們知道每次客戶端在此傳送請求的時候都會攜帶乙個包含了jsessionid的cookie,然後伺服器收到了這個jsessionid之後從session列表的map中根據key=jsessionid去查詢,然後得到session將結果返回給客戶端,客戶端拿到資料。那麼如果cookie禁用了怎麼辦?當然這個場景其實很多**是禁止cookie別禁用的,不然**無法使用。但是我們還是得考慮某些特殊場景的需求,便於我們深入理解。
cookie禁用之後流程變化?
cookie禁用之後,客戶端在次請求的時候是沒有帶jsessionid的cookie,伺服器沒有拿到帶jsessionid的cookie那麼就預設是客戶端的第一次請求,隨機產生乙個jsessionid和session,但是這個jsessionid給客戶端是沒有cookie快取資料的。所以會話就無妨實現跟蹤了。
cookie禁用session怎麼能繼續使用?
由於cookie可以被人為的禁止,必須有其它的機制以便在cookie被禁止時仍然能夠把session id傳遞歸伺服器,經常採用的一種技術叫做url重寫,就是把session id附加在url路徑的後面,附加的方式也有兩種:效果見截圖,在url後面加jsessionid可以請求到伺服器中的session資料。
一種是作為url路徑的附加資訊,
另一種是作為查詢字串附加在url後面。
**中如何實現呢?
1、重定向url重寫的實現
我們可以使用重定向轉到我們要獲得session資料的介面,然後url重寫就可以達到我們之前把字串加入到url的目的。
2、超連結的url重寫的實現
禁用cookie之後我們同樣可以向伺服器請求拿到session資訊,但是解決方法都是url之後加上了jsessionid,這樣直接暴露在瀏覽器上,比不禁用cookie更加不安全,所以很多**是不允許禁用cookie的。
6、應用場景
session:
除非是純靜態的頁面,否則都會用到session來記錄使用者的行為。生產環境中經常用到的單點登入功能
cookie典型應用場景:
1.判斷使用者是否登陸過**,以便下次登入時能夠直接登入。如果我們刪除cookie,則每次登入必須從新填寫登入的相關資訊。而修改賬戶密碼等操作也需要對其登陸狀態進行判斷。
2.另乙個重要的應用是「購物車」中類的處理和設計。使用者可能在一段時間內在同一家**的不同頁面選擇不同的商品,可以將這些資訊都寫入cookie,在最後付款時從cookie中提取這些資訊,當然這裡面有了安全和效能問題需要我們考慮了。
全文完,如有不清楚之處,感覺各位同僚指點。
小白也能看懂的XML簡介
目錄 一.xml簡介 二 xml用途 三 xml結構 四 xml語法 五 xml元素 六 xml屬性 七 總結 1.xml指可擴充套件標記語言,很類似html。xml被設計為傳輸和儲存資料,其焦點是資料的內容 html被設計用來顯示資料,其焦點是資料的外觀。2.xml的設計宗旨是傳輸資料,而非顯示資...
小白也能看懂的css基礎(一)
2 選擇器 3 常用的屬性 3.4 背景background 3.5 標籤顯示模式 display 一般少用,不推薦 backgroung color blue 在head標籤內放置,樣式不多時使用 新建檔案寫css樣式,在head內寫link引入html。標籤選擇器 標籤名 id選擇器 id名 i...
小白也能看懂的css基礎(三)
接上文 css基礎 二 解決方法 對img設定display block 調整vertical align 取值 top middle bottom 結合實際來選擇解決方法 ie相容問題 ie8以下瀏覽器背景復合屬性寫法問題 bg url和no repeat之間沒有空格,在ie8以下顯示異常。ie6...