http之Session&Cookie

zzz紫川發表於2016-11-24

  百度了一波session與Cookie,我發現這東西遠比我想象中更復雜(可能是因為我不明白底層的執行原理)。網上也是一堆的關於Session與Cookie區別/聯絡的文章,然而,我看完了還是一臉懵逼的狀態,所以自己動手寫寫對http之session&cookie的簡單瞭解。走過路過的各位dalao,歡迎拍磚斧正……

 

  前置條件:只有驗證通過之後才能訪問網站(可以理解為只有登入之後才能正常使用網站)

  因為http協議是無狀態的,所以伺服器是不可能知道在上一次http請求中,我通過了驗證。這種情況如何解決呢?

  可以做成每個網頁都有使用者名稱和密碼的驗證(不過,我想也沒幾個人願意訪問一個網頁就輸一次使用者名稱密碼),這種方法也會對伺服器造成很大負擔(因為每個Request都需要到資料庫中去驗證)。

  其次,可以選擇在伺服器端或客戶端儲存一些代表自己身份的資訊,每次請求帶上一個能代表自己身份的“銘牌”就行了,所有就有了Session與cookie。

 

  當瀏覽器向伺服器傳送一個請求時,如果需要建立Session時(什麼時候需要,什麼時候不需要,看文章下方斜體<補充>),伺服器會為瀏覽器視窗建立一個獨一無二的Session記憶體(其中包含一個唯一的Session id)。

 

  首次建立Session的時候,服務端會在http協議中告知客戶端,需要在Cookie中記錄一個Session id,以後每次傳送請求的時候,帶上Session id,我就知道你是誰了。

(PS:如果客戶端禁用Cookie,咋整?一般這種情況下,可以通過使用URL重寫,將Session id作為引數傳遞,來跟蹤會話。即每次http互動,URL後面都會附加一個諸如sid=xxx這樣的引數,使得服務端可以根據它來跟蹤使用者。)

 

Cookie:是瀏覽器儲存資訊的一種方式,可以理解為一個檔案,儲存在客戶端。伺服器可以通過響應瀏覽器的set-cookie標頭,設定Cookie的資訊。只允許建立txt的文字檔案(客戶端可以阻止服務端寫入,還可以刪除)

-------------------------------------------------

Cookie是有時間限制的,根據生命期不同分成兩種:

會話Cookie:生命期為瀏覽會話期的Cookie。如果不設定過期時間,則表示這個Cookie生命週期為從建立到瀏覽器關閉止,只要關閉瀏覽器視窗,Cookie就消失了。會話Cookie一般不儲存在硬碟上而是儲存在記憶體裡。

持久Cookie:如果設定了過期時間(setMaxAge(606024)),瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些Cookie依然有效直到超過設定的過期時間。儲存在硬碟上的Cookie可以在不同的瀏覽器程式間共享,比如兩個IE視窗。而對於儲存在記憶體的Cookie,不同的瀏覽器有不同的處理方式。

                                                                             ----------------------------------

Session:百度一波翻譯,會話的意思。原本所表達的含義是指有始有終的一系列動作/訊息。當它與網路協議相關聯的時候,通常表示“面向連線”(指的是通訊雙方在通訊之前要建立一個通訊的渠道)或“保持狀態”(指通訊的一方能夠把一系列的訊息關聯起來,使得訊息之間能夠互相依賴,例一個服務員能夠認出再次光臨的顧客且記得上次這個顧客還欠店裡一份飯錢)兩個含義,我這裡說的Session,是伺服器端的一種機制,使用類似於雜湊表的結構來儲存資訊。Session通過Cookie,在客戶端儲存Session id,而將使用者的其他會話訊息儲存在服務端的Session物件中。與此相對的,Cookie需要將所有資訊都儲存在客戶端。因此Cookie存在著一定的安全隱患,例如本地Cookie中儲存的使用者名稱密碼被破譯,或cookie被其他網站收集。

  補充為某個客戶端的請求建立一個Session的時候,伺服器會首先檢查這個客戶端的請求裡是否包含了一個Session標識(即Session id)。如果已經包含一個Session id則說明以前已經為此客戶建立過Session,伺服器就按Session id把這個Session檢索出來使用(如果檢索不到,可能會新建一個,這種情況可能出現在服務端已經刪除了該使用者對應的Session物件,但使用者人為地在請求的URL後面附加上一個Jsession的引數)。如果客戶端請求中不包含Session id,則為此客戶端建立一個Session並且同時生成一個與之相關聯的Session id,這個Session id將在本次響應中返回給客戶端儲存。

  其實還有很多要寫的、但是發現自己越寫越混亂(⊙﹏⊙)、暫時就這樣吧,由於程式碼能力有限,無奈之下只能用純文字說明了。寫在這,權當自己做筆記了.....

PS:之前自己折騰了一下LoadRunner的指令碼關聯,發現登入需要關聯的引數一般是Session id,就對Session產生了點興趣。至於Cookie,想必每個測試工程師都應該聽過自家的開發對自己說過這句話:“你把快取清了在試試....”,哈哈哈~~

   這是我第一篇筆記,開始自己的學習之路吧。吼吼~~~

 

____努力可能比較累,但是心安....

相關文章