1. Spring Session 簡介

Spring session 是用來解決分佈式環境下的session共享問題的. 不僅支持HttpSession, 也支持WebSession和WebSocket. 不過筆者基本上沒使用過WebSession和WebSocket, 所以筆者只介紹HttpSession 的用法.

1. Spring Session 簡介

spring session 提供了管理用戶session信息的API和實現, 可以靈活地選擇. spring session 不僅僅支持Httpsession的分佈式共享, 也支持WebSocket 和 WebSession. 看官網描述

  • HttpSession: Allows replacing the HttpSession in an application container-neutral way, with support for providing session IDs in headers to work with RESTful APIs.
  • WebSocket: Provides the ability to keep the HttpSession alive when receiving WebSocket messages
  • WebSession: Allows replacing the Spring WebFlux’s WebSession in an application container-neutral way.

2. spring session 存儲模式

spring session 的核心是session中心化存儲, spring session 支持多種存儲方式, 比如jdbc, mongodb, redis等方式. 不過筆者強烈推薦使用redis, 其原因有:

  • redis 屬於nosql 數據庫, 無需初始化任何表
  • redis 擁有自動管理key的過期的功能, 這個和session超時機制很像
  • redis 性能非常高

3. 使用場景

  • session 數據遷移: 如果應用需要在session中存儲大量數據時, 然而jvm 的最大內存有限制, 則可以利用spring session將session 數據存儲在redis 中
  • session 共享: 當多個應用需要session共享時, 可以將session進行中心化存儲, 都存儲在redis 中

4. spring session 的兩種SessionId 解析器

spring session 擁有兩種sessionId解析器: HeaderHttpSessionIdResolver 和 CookieHttpSessionIdResolver

  • CookieHttpSessionIdResolver 和 HeaderHttpSessionIdResolver 均爲sessionId 的解析器.
  • CookieHttpSessionIdResolver 會從請求攜帶的Cookie中解析名爲SESSION的Cookie, 然後進行base64爲解碼, 解碼後的值爲sessionId; 響應結束時, 將sessionId, 以Set-Cookie:SESSION 存入header, 然後返回給客戶端
  • HeaderHttpSessionIdResolver 會從請求頭中解析headerName 爲x-Auth-Token 或 authenticationInfo 的值, 解析的值即爲sessionId; 響應結束後, 將sessionId, 以x-Auth-Token或authenticationInfo 存入header, 然後返回客戶端.

5. Spring session的兩種刷新模式

  • ON_SAVE: 只有當SessionRepository.save(Session)方法被調用時, 纔會將session中的數據同步到redis中. 在web 應用中, 當請求完成響應後, 纔開始同步. 也就是說在執行response 之前session數據都是緩存在本地的.
  • IMMEDIATE: 實時同步session 數據到redis. 當執行SessionRepository.createSession()時, 會將session數據同步到redis中; 當對session的attribute進行set/remove 等操作時, 也會同步session中的數據到redis中.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章