新聞中心
假設一個場景:在 Session 中保存一個變量,用戶每請求一次變量增加 1,然后把最新的值以 HTML 的方式返回給客戶端。

我們提供的服務有:成都網(wǎng)站制作、成都網(wǎng)站建設、外貿(mào)營銷網(wǎng)站建設、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、應縣ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的應縣網(wǎng)站制作公司
用戶第一次請求,Web 服務器(或者應用服務器,如 Tomcat)返回數(shù)字 1,那么此時 HTTP 傳輸已經(jīng)結束,TCP 經(jīng)歷四次揮手,連接關閉。
- 當頁面再次刷新時(TCP 重新連接,客戶端是新的端口)服務器端是如何知道用戶對應的 Session 的?
- 此時關閉瀏覽器 Session 是否會釋放?
眾所周知 HTTP 是無狀態(tài)的協(xié)議,它的狀態(tài)管理機制是后來增補上去的,被記錄在rfc6265(HTTP State Management Mechanism)。具體方法很簡單:
- 服務器端->客戶端增加一個新的返回頭部“Set-Cookie”,通過它設置一個 Key/Value 結構的數(shù)據(jù);客戶端負責保存這個數(shù)據(jù)。
- 客戶端->服務器端增加一個新的請求頭部“Cookie”,把保存的 Cookie(Key/Value 結構)提交給服務器端。
這個機制就是 Cookie,Session 機制是建立在 Cookie 機制之上的。對于 JavaEE 而言:
用戶請求的業(yè)務邏輯中出現(xiàn) Session 操作,并且本次請求沒有 JSESSIONID 的頭部被傳遞過來,服務器端會通過 Set-Cookie 設置上一個新的
當用戶再次請求,Cookie 中包含了 JSESSIONID,服務器端會依據(jù)此判斷出用戶所屬的 Session
所以回到開始的兩個問題:
- 服務器端通過讀取 Http 頭部 Cookie 部分 JSESSIONID 找到用戶所屬的 Session
- 關閉瀏覽器只是 JSESSIONID 這個 Cookie 被刪除;服務器端的 Session 不會被刪除。刪除時間是通過session-timeout配置的
有一種網(wǎng)絡攻擊方法叫 Cookie/Session 欺騙,比如某管理員用戶登錄到系統(tǒng)了,如果我們趁他不在電腦旁邊的時候把他的 JSESSIONID 復制走;然后打開瀏覽器訪問相同的網(wǎng)址,通過瀏覽器設置上 JSESSIONID,再次刷新,你會發(fā)現(xiàn)已經(jīng)登錄成功了。也就是說服務器端其實只認 JSESSIONID,它甚至無法區(qū)分究竟有多少管理員“同時在線”。
【本文是專欄作者“邢森”的原創(chuàng)文章,轉(zhuǎn)載請聯(lián)系作者本人獲取授權】
本文題目:一分鐘理解Session和Cookie的關系
瀏覽地址:http://fisionsoft.com.cn/article/codgics.html


咨詢
建站咨詢
