深度理解會話和Cookies之二

2021-08-22 04:33:57 字數 1530 閱讀 9401

那麼,我們怎樣用cookies保持狀態呢,當客戶端第一次請求伺服器時,伺服器會返回乙個請求頭中帶有set-cookie欄位的響應給客戶端,用來標記是哪乙個使用者,客戶端瀏覽器會把cookies儲存起來。當瀏覽器下一次再請求該**時,瀏覽器會把此cookies放到請求頭一起提交給伺服器,cookies攜帶了會話id資訊,伺服器檢查該cookies即可找到對應的會話是什麼,然後再判斷會話來以此辨認使用者狀態。

在成功登陸某**時,伺服器會告訴客戶端設定哪些cookies資訊,在後續訪問頁面時客戶端會把cookies傳送給伺服器,伺服器再找到相應的會話從而加以判斷。如果會話中的某些設定登入狀態的變數是有效的,那就證明使用者處於登陸狀態,此時返回登入之後才可以看到的網頁內容,瀏覽器再進行解析便可以看到了。

反之,如果傳給伺服器的cookies是無效的,或者會話已經過期了,我們將不能繼續訪問頁面,此時可能會收到錯誤的響應或者跳轉到登入頁面重新登入。

所以,cookies和會話需要配合,乙個處於客戶端,乙個處於服務端,二者共同協作,就實現了登入會話控制。

可以看到,有很多條目,期中每個條目都可以稱為cookie,它有如下幾個屬性:

從表面意思來說,會話cookie就是把cookie放在瀏覽器記憶體裡,瀏覽器關閉之後該cookie即失效;持久cookie則會儲存到客戶端的硬碟中,下次還可以繼續使用,用於長久保持使用者登入狀態。

其實嚴格來說,沒有會話cookie和持久cookie之分,只是由cookie的max age或expires欄位決定了過期的時間。

因此,一些持久化登入的**其實就是把cookie的有效時間和會話有效期設定的比較長,下次我們再訪問頁面時仍然攜帶之前的cookie,就可以直接保持登入狀態。

在談論會話機制的時候,常常會聽到這樣一種誤解——「主要關閉瀏覽器,會話就消失了」。可以想象我們平常生活中的會員卡,除非顧客主動對店家提出銷卡,否則店家是不會輕易的刪除顧客的資料的,對會話來說,也是一樣,除非程式設計師通知伺服器刪除乙個會話,否則伺服器會一直保留。比如,程式一般都是我們做登出操作時才去刪除會話。

但是當我們關閉瀏覽器時,瀏覽器不會主動在關閉之前告訴伺服器它將要關閉,所以伺服器根本不會有機會知道瀏覽器已經關閉,之所以有這種錯覺,是因為大部分會話機制都是用cookie來儲存會話id資訊,而關閉瀏覽器cookie就消失了,再次連線伺服器時,也就無法找到原來的會話了。如果伺服器設定的cookies儲存在硬碟上,或者使用某種方法改寫瀏覽器發出的http請求頭,把原來的cookies傳送給伺服器,則再次開啟瀏覽器,仍然能夠找到原來的會話id,依舊還是可以保持登入狀態的。

而且恰恰關閉瀏覽器不會導致會話被刪除,這就需要伺服器為會話設定乙個失效時間當距離客戶上一次使用會話的時間超過這個失效的時間時,伺服器就可以認為客戶端已經停止了活動,才會把會話刪除以節省儲存空間。

好了,在閱讀了這兩篇博文後,相信你對會話和cookies有了深層次的理解,技術是沒有止境的,只有不斷鑽研,不斷進步,我們的人生價值才能體現出來,繼續努力吧!

會話(服務端)和Cookies(客服端)

引 在瀏覽 的過程中,我們經常會遇到需要登入的情況,有些頁面只有登入之後才可以訪問 而 且登入之後可以連續訪問很多次 但是有時候過一段時間就需要重新登入。還有一些 在打 開瀏覽器時就向動登入了,而且很長時間都不會失效,這種情況又是為什麼?靜態網頁 不能根據url的變化顯示內容等。動態網頁 可以隨著u...

動網論壇深度整合之Cookies詳解

動網論壇這個另無數asp開發者頭疼的傢伙,不要說它整個程式如何,如何難懂,相互關聯如何複雜,就單說它的cookies這一項就讓很多人摸不著邊際,在動網6.0之前的版本,有個漏洞就出在cookies上,別人可以利用cookies欺騙對動網進行攻擊,在之後的版本動 別加強了cookies的安全性,這一漏...

深度理解STL之map set

課程設計做了這個一直沒有整理 搬運 set算是關鍵字和相同的特殊map set應該更加被強調理解為 集合 而集合所涉及的操作並 交 差等,即stl提供的如交集set intersection 並集set union 差集set difference 和對稱差集set symmetric differ...