Session

背景:爲了存儲HTTP通信中客戶端與服務器之間的會話狀態

Cookie和Session都是爲了解決HTTP協議的無狀態問題,存儲HTTP通信中客戶端與服務器之間的會話狀態。html

不一樣的是Cookie依賴HTTP請求頭與響應頭實現且存儲在客戶端,而Session存儲在服務器端,Session能夠經過Cookie實現,也可使用URL回寫的方式實現。html5

若是若是瀏覽器不支持 Cookie,也可使用如下辦法,記錄標識符:java

  • URL 重寫: 做爲路徑參數包含到 url 中,如 /path;JSESSIONID=xxx
  • URL 請求參數: 將會話惟一標識做爲查詢參數添加到頁面全部連接中,如 /path?JSESSIONID=xxx

Cookie經過Cookie請求頭和Set-Cookie響應頭實現:

Set-Cookie - 服務器響應頭,用於告訴客戶端要設置Cookie
Cookie - 請求頭,根據Set-Cookie設置並保存到客戶端的Cookie值,會在再次發送HTTP請求時經過這個請求頭一同發送到服務器spring

session

Cookie很好的解決了HTTP通信中狀態問題,但其自己也存在一些問題,如:apache

  • 客戶端存儲,可能會被修改或刪除
  • 發送請求時,Cookie會被一塊兒發送到服務器,當Cookie數據量較大時也會帶來額外的請求數據量
  • 客戶端對Cookie數量及大小有必定的限制
  • Session解決了Cookie的一些缺點。Session一樣是爲了記錄用戶狀態,對於每一個用戶來講都會有相應的一個狀態值保存在服務器中,而只在客戶端記錄一個sessionID用於區分是哪一個用戶的Session。

與Cookie相比Session有必定的優點:後端

  • Session值存儲在服務器,相對來講更安全
  • 客戶端發送給服務器的只有一sessionID,數據量更小
  • Session一樣須要在客戶端存儲一個sessionID。能夠這個值存儲在Cookie,每次發送請求時經過Cookie請求頭將其發送到服務器;也能夠不使用Cookie,而將sessionID作爲一個額外的請求參數,經過URL或請求體發送到服務器。

servlet session

Java API Servlet中的會話由javax.servlet.http.HttpSession接口的實現表示。可經過HttpServletRequest方法getSession()或getSession(boolean create)進行訪問。根據選擇的方法,該方法的調用將致使如下狀況之一:瀏覽器

  • 檢索與用戶關聯的當前會話(會話必須在調用以前存在)
  • 建立新會話(若是該會話不存在而且咱們使用getSession()方法)不帶參數或帶參數create等於true)
  • 不執行任何操做(會話不存在,咱們調用getSession(false)方法)

好的,咱們已經知道一個會話與當前請求相關聯,而且能夠經過兩種不一樣的方法進行檢索。假設咱們檢索了所需的會話對象。如今咱們能夠將一些數據放入(方法putValue()或setAttribute()),從(getValue())獲取一些數據或刪除一些數據(removeValue()或removeAttribute())。請注意,在2.2版本的API Servlet中,value已由attribute代替。這就是爲何咱們要使用兩種方法來設置或刪除會話信息的緣由。緩存

會話與請求相關聯,因爲會話ID,會話能夠在多個請求中持續存在。可是,能夠經過如下三種方式中斷持久性:
-會話超時:當在一段時間內不使用會話時。
-服務器故障:當服務器關閉時,會話可能會丟失(要了解更多信息,請直接參閱會話恢復部分)。
-顯式會話無效:經過調用HttpSession方法invalidate(),咱們能夠顯式使整個會話無效。tomcat

tomcat的session存儲(應用程序容器)

  • org.apache.catalina.session.StandardManager: java堆中
  • org.apache.catalina.session.FileStore: 文件
  • org.apache.catalina.session.JDBCStore: jdbc

spring session(不依賴(應用程序容器))

Spring Session提供了一種API和實現,用於管理用戶的會話信息,同時使其輕鬆地支持集羣會話,而沒必要依賴於特定於應用程序容器的解決方案。它還提供與如下內容的透明集成:安全

  • HttpSession:容許以與HttpSession應用程序容器無關的方式替換,並支持在標頭中提供會話ID以與RESTful API一塊兒使用。
  • WebSocket:提供HttpSession接收WebSocket消息時保持活動的功能
  • WebSession:容許以與WebSession應用程序容器無關的方式替換Spring WebFlux 。

後端存儲支持的方案:

session串號

http://jm.taobao.org/2013/06/13/2769/
緩存服務器緩存了header

參考

https://docs.spring.io/spring-session/docs/current/reference/html5/#introduction

相關文章
相關標籤/搜索