1. 程式人生 > >Session 和 Cookie

Session 和 Cookie

連接 無法 程序 響應頭 網站 invalid memcach 打開 發送請求

1. HTTP是無狀態協議?
  HTTP無狀態協議,是指協議對於事務處理沒有記憶能力。同一個客戶端的這次請求和上次請求是沒有對應關系,對http服務器來說,它並不知道這兩個請求來自同一個客戶端。
  無狀態,意味著如果後續處理需要前面的信息,則它必須重傳。這樣可能導致每次連接傳送的數據量增大。但是另一方面,在服務器不需要先前信息時它的應答就較快。
  因此在web應用開發裏就出現了保持http狀態的技術:一個是cookie技術,另一種是session技術。

2. 什麽是Cookie?
  Cookie實際上是一小段的文本信息。
  客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie,客戶端瀏覽器會把Cookie保存起來。


  當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。
  服務器還可以根據需要修改Cookie的內容。Cookie的內容主要包括:名字,值,過期時間,路徑和域。

3. 服務端怎麽向客戶端頒發Cookie?
  客戶端第一次請求服務器的時候,服務器的響應頭中會有一個 Set-Cookie: JSESSIONID=0000581f4j5s8Y7fL1gKZ5NpavO:17tvfoc18;。
  Set-Cookie由服務器發送,它包含在響應體的頭部中。它用於在客戶端創建或更新Cookie。

4. 客戶端怎麽攜帶著Cookie訪問服務器?


  客戶端發送請求時會自動在請求頭上添加:Cookie:JSESSIONID=0000581f4j5s8Y7fL1gKZ5NpavO:17tvfoc18;(客戶端第一次拿到的SessionID)
  只有cookie的domain和path與請求的URL匹配才會發送這個cookie。


5. 什麽是Session?
  客戶端瀏覽器訪問服務器的時候,服務器把客戶端信息以某種形式記錄在服務器上。這就是Session。客戶端瀏覽器再次訪問時只需要從該Session中查找該客戶的狀態就可以了。

6. Session在何時創建?
  在服務器端程序運行的過程中創建的。在Java中是通過調用HttpServletRequest的getSession(true)方法創建的。


  在創建了Session的同時,服務器會為該Session生成唯一的SessionId,而這個SessionId在隨後的請求中會被用來重新獲得已經創建的Session。
  session的實現機制都是web容器裏內部機制。

7. 會話是怎麽保持的?
  在Session被創建之後,就可以調用Session相關的方法往Session中增加內容了,而這些內容只會保存在服務器中,發到客戶端的只有SessionId。
  當客戶端再次發送請求的時候,會將這個SessionId帶上,服務器接受到請求之後就會依據SessionId找到相應的Session,從而再次使用之。正式這樣一個過程,用戶的狀態也就得以保持了。

8. Session在什麽時候刪除?
  超時;程序調用HttpSession.invalidate();程序關閉;

9. Session存放在哪裏?
  一般存放在服務器端的內存中。不過session可以通過特殊的方式做持久化管理(memcache,redis)。

10. Session的id是從哪裏來的?
  當客戶端第一次請求session對象時候,服務器會為客戶端創建一個session,並將通過特殊算法算出一個session的ID,用來標識該session對象

11. Session會因為瀏覽器的關閉而刪除嗎?
  不會,Session只會通過上面提到的方式去關閉。
  瀏覽器關閉只是把sessionId給清除了,所以再次打開瀏覽器並請求服務器,你的登錄狀態無法找到,因此你需要重新登錄。
  一般情況下,瀏覽器如果不刷新或者不重新請求的話,服務器一般會緩存session數據20分鐘左右

Session 和 Cookie