為什么要用cookie和session【多測師_王sir】


為什么要用Session和Cookie?
簡單一句話,因為Session和Cookie可以記錄用戶狀態信息。
這到底啥意思呢?

一、動態網頁的出現
什么是靜態網頁
含義:一個網頁的內容是HTML代碼編寫的,文字、圖片等內容均可通過HTML代碼指定了
優勢:加載速度快,編寫簡單
劣勢:可維護性差,擴展性差,不能根據URL顯示不同的內容;例如:在URL傳入一個name參數想在網頁上顯示,靜態網頁是無法做到的
總結:弊大於利

動態網頁的誕生
動態網頁可以動態解析URL中參數的變化,關聯數據庫並動態呈現不同的頁面內容,非常靈活多變。
現在遇到的大多數網站都是動態網站,不再是一個簡單的HTML頁面,可能由JSP、PHP、Python等語言編寫的,功能比靜
態網頁強大和豐富太多。 場景:一個需要登錄的動態網站,在登錄后需要保持登錄狀態,以便后續 訪問網站其他網頁;那么我們要通過什么來保存這個登錄狀態呢? 二、HTTP是無狀態協議 HTTP無狀態是指? HTTP協議對事務處理是沒有記憶能力,也就是說服務器不知道客戶端是什么狀態。 這是什么意思呢? 當我們向服務器發送請求后,服務器解析處理請求,然后返回響應,服務器負責完成這個過程(也是一個事務),而這個過程
是獨立的,服務器不會記錄前后狀態的變化,也就是缺少狀態記錄。
無狀態導致的后果? 意味着后續發出的請求需要處理前面請求的響應,則必須重傳,這也導致需要額外傳遞一些前面的重復請求,才能獲取后續
響應。但為了保持前后狀態,我們也不能將前面的請求全部重傳一次,這太浪費資源了;就好像如果一個網站 每次發出一個請求前都要先發出一次登錄請求,這無疑大大增加了資源浪費程度。

上圖可以看出,Session和Cookie在一個網站中各自發揮的作用。
實際場景
1.當我們登錄之后,服務端就會創建一個屬於當前用戶的Session、里面保存的就是當前用戶的信息;
2.然后瀏覽器會根據服務器的響應頭中Set-Cookie字段生成相關Cookie,相當於一個用戶憑證;
3.只需要在下次請求時攜帶這些Cookie,服務器就能通過Cookie來判斷用戶是否是登錄狀態,然后返回對應的響應。
生動形象理解Cookie和Session的關系
1.Session是保存在服務器端,Cookie是保存在客戶端。 2.每次用戶訪問網站的時候,相當於去串門。 3.用戶帶着cookie去服務器家,當當當敲門。 4.服務器問是誰啊? 5.用戶:是我(cookie)啊! 6.服務器:讓我來確認一下(session確認)。 7.服務器確認完畢后,放用戶進門。 實際網站登錄請求的響應頭 1.這是一個網站登錄之后返回的響應頭,可以看到服務器要求瀏覽器設置的Cookies有好幾個;這就是Cookies的來源,而token一般 會作為用戶的唯一憑證【登錄成功,響應頭set-cookies,瀏覽器設置Cookies】 2.當瀏覽器下一次再請求該網站時,瀏覽器會把這些Cookies放到請求頭一起提交到服務器;而Cookies攜帶了SessionID信息 (token)【再次請求,帶上Cookies,包含SessionID】 3.服務器通過SessionID即可找到對應的用戶Session信息,然后判斷該用戶的登錄狀態【服務器根據SessionID獲取用戶登錄態】 4.如果Session中某些設置登錄狀態的變量是有效期內的,證明用戶處於登錄狀態【Session有效,用戶已登錄】 5.此時服務器就會返回需要登錄之后才可以查看的網頁內容,瀏覽器再進行解析便可以看到了【返回請求響應內容】 6.當Cookie無效或者Session已過期后,我們再訪問網站就需要重新登錄了【Cookie無效,Session過期,要再次登錄】

三、Session和Cookie在登錄功能上的協同關系

Session

會話,指有始有終的一系列動作/消息;比如:打電話時,從拿起電話,撥號,通話,掛斷電話這一系列過程可以稱為一個Session。

實際場景

在Web中,Session對象用來存儲特定用戶Session所需的屬性和配置信息,這樣用戶在應用程序的Web頁之間跳轉時,

存儲在Session對象中的變量將不會丟失,而是在整個用戶Session中存在下去

當用戶請求網頁時,該用戶還沒有Session,則Web服務器將自動創建一個Session對象當Session過期或被放棄后,服務器將終止該Session

Cookie

某些網站為了辨別用戶身份,進行Session跟蹤而存儲在用戶本地終端上的數據。

四、會話Cookie和持久Cookie

會話Cookie
可以將打開瀏覽器-關閉瀏覽器理解成一個會話,會話Cookie的有效期僅在瀏覽器打開期間;而會話Cookie是存在瀏覽器內存里的。
實際場景:涉及錢,涉及利益、機密內容的網站一般都是會話Cookie,如企業郵箱等。
持久Cookie 持久Cookie是存在客戶端本地硬盤中,不受瀏覽器關閉影響,下次再次訪問該網站時還能繼續使用,用於長久保持用戶登錄狀態。 實際場景:可以勾選【自動登錄】、【30天內自動登錄】的網站用的就是持久Cookie。
持久Cookie發出請求時,客戶端與服務器之間的時序圖:

 

瀏覽器中看Cookie
Name:Cookie 的名稱。Cookie 一旦創建,名稱便不可更改
Value:Cookie 的值。如果值為 Unicode 字符,需要為字符編碼。如果值為二進制數據,則需要使用 BASE64 編碼。
Domain:Cookie注入的域名,如.baidu.com下的Cookie,只要Host以.baidu.com結尾的域名都能訪問該Cookie
Path:允許使用該Cookie的路徑,一般都為 /
Expires/Max-Age:Cookie失效時間,若沒有指定失效時間則默認當瀏覽器關閉時Cookie失效
Size:Cookie大小
HttpOnly:若True,則不允許腳本來訪問該Cookie(如:JS)
Secure:Cookie是否僅被使用安全協議傳輸,默認為False

 

【掃描如下二維碼里面學習接口自動化加密+鑒權+接口自動化框架設計】

【往下看還有重點cookie+session知識講解】

 

 

作者:多測師_王sir
網址:www.duoceshi.cn

【超級重點知識講解】
"只要關閉瀏覽器,Session 就消失了" --錯! 實際場景:去健身房辦理的會員卡,除非你自己要求銷卡,不然店家不會隨意銷掉你的卡。 所以,對於Session也是一樣的,登錄的時候服務器幫你生成了一個Session,是不會輕易刪除你的Session,除非你
自己提出要刪除or Session有效期過了;而一般我們會通過【退出】來刪除觸發服務器刪除Session。 當我們關閉瀏覽器時,瀏覽器是不會通知服務器說它要關閉,所以服務器根本不知道瀏覽器已關閉,造成這樣的誤解全都是因為:
1.一般情況下,網站都會用Cookie來保存SessionID信息的。 2.當你的Cookie是會話Cookie時,關閉瀏覽器Cookie就會消失。 3.再次打開網站也找不回之前的那個Cookie對應的SessionID。 4.所以無法通過原來的SessionID在服務器查找對應用戶的登錄狀態,只能重新登錄生成新的Cookie來記錄新
的SessionID。 如何解決? 就是將Cookie設置為持久Cookie,當你關閉瀏覽器再打開網站時,還是能從本地讀取到Cookie,從而獲取到原
來的SessionID,以此來保持登錄狀態。 另外 而恰恰因為關閉瀏覽器並不會讓服務器主動刪除Session,為了避免服務器的資源浪費,一般服務器都會為每個
Session設置一個失效時間,當Session的時間超過失效時間時,服務器會自動刪除Session。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM