通過該篇博客,你將了解到如何快速通過 SpringBoot 2 + Spring Session 來實現分布式 Session 環境的搭建。
SpringBoot 整合 Spring Session 前,先了解一下什么是 Spring Sessin。
mvc中如何保持session。Spring 官方 (https://spring.io/projects/spring-session)關于 Spring Session 介紹如下:
Spring Session provides an API and implementations for managing a user’s session information.
Spring Session makes it trivial to support clustered sessions without being tied to an application container specific solution. It also provides transparent integration with:
- HttpSession - allows replacing the HttpSession in an application container (i.e. Tomcat) 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
中文翻譯如下 :
Spring Session提供了用于管理用戶會話信息的API和實現。
Spring Session使得支持集群會話變得微不足道,而不依賴于特定于應用程序容器的解決方案。它還提供透明集成:
- HttpSession - 允許以應用程序容器(即Tomcat)中立的方式替換HttpSession,支持在頭文件中提供會話ID以使用RESTful API
- WebSocket - 提供在接收WebSocket消息時保持HttpSession活動的能力
- WebSession - 允許以應用程序容器中立方式替換Spring WebFlux的WebSession
從官方介紹中可以了解到 Spring Session 是用來解決,集群下實現全局 Session的一個框架實現。全局 Session 也可以理解成分布式Session。那什么是分布式Session呢?
分布式Session 就是我們的 Session 會話對于集群中的每個服務共享。我這里舉一個例子:
spring session原理?假如一個商品服務通過2臺機器 A和B 進行集群部署,用戶訪問 A服務器登錄成功后,將此用戶Session信息保存在 A 服務器上。突然A服務器突然宕機,用戶訪問跳轉B服務器上。此時B服務器上并沒有A服務的 Session。用戶需要再次執行登錄操作。而Spring Session 可以將用戶登錄后的Session 保存在Redis或者數據庫中,當 A 服務器宕機切換到 B 服務器時,此時B服務器從Redis中獲取Session,無需在進行登錄操作。
該篇博客介紹 Spring Session 通過 Redis 存儲Session的方式來實現。
在整合前你首先應該在本地或者遠程的機器上安裝 redis 服務,可以參考 Windows 安裝 Redis
教程。其他系統可以百度或者期待我后續的博客教程。
SpringBoot 和 Spring Session 整合的配置需要引入2個 start依賴:
具體代碼如下:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId></dependency>
如果你的 Redis服務是單機版默認配置,并且和你的 SpringBoot 應用在同臺機器上。SpringBoot 和 Spring Session 的整合就搞定了。是不是很簡單哈。
Java session。如果你的Redis服務在遠程的機器上,那么你需要在 application.properties 配置文件中配置一下 Redis的主機ip 和 端口號即可。
spring.redis.host=遠程 Redis 服務主機 IP
spring.redis.port=遠程 Redis如果你的單機版Redis服務不是默認配置, 那么你需要像遠程Redis服務一樣進行配置其 主機ip 和端口號。
創建 2個SpringBoot 應用實例, 通過設置不同的端口號進行區分。2個 SpringBoot 應用實例。一個負責創建Session、 一個負責獲取Session。
application.properties 配置如下:
server.port=8090
server.servlet.context-path=/sbe
spring.redis.host=localhost
獲取Session 測試代碼如下:
@RestController
@RequestMapping("/session")
public class SpringSessionTestController {@RequestMapping("/get/{name}")public String getSesseion(HttpServletRequest request,@PathVariable("name") String name){HttpSession session = request.getSession();String value = (String)session.getAttribute(name);return "sessionId:"+session.getId()+" value:"+value;}
}
@SpringBootApplication?application.properties 配置如下:
server.port=8080
server.servlet.context-path=/sbe
spring.redis.host=localhost
創建Session測試代碼如下:
@RestController
@RequestMapping("/session")
public class SpringSessionTestController {@RequestMapping("/add/{name}/{value}")public String addSession(HttpServletRequest request,@PathVariable("name") String name,@PathVariable("value") String value){HttpSession session = request.getSession();session.setAttribute(name,value);return "sessionId:"+session.getId()+" name:"+name;}
}
測試結果如下圖所示:
在快速整合的介紹中 我們使用都是默認的配置。如果你想自定義定義 Session 過期時間 、session的刷新模式 、存儲Session的命名空間。可以通過在 application.properties 中進行配置。
具體配置介紹如下:
springsession跨域。spring.session.store-type=redis
設置 Spring Session 使用 Redis 進行存儲。默認配置就是 redis
spring.session.timeout=10m
設置 Spring Session 的過期時間。如果不指定單位模式是 s。
也可以通過在啟動類上聲明@EnableRedisHttpSession進行配置。
例如:@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 3600)
spring.session.redis.flush-mode=on_save
session刷新模式,有2中
springboot獲取session。也可以通過在啟動類上聲明@EnableRedisHttpSession進行配置。
例如:@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.ON_SAVE)
spring.session.redis.namespace=redis:session
存儲 Session的命名空間,默認是spring:session。
通過 Redis Desktop Manager 可以查看存儲到Redis中的session信息的key都是以
spring:session打頭的。
命名空間主要是用于多個服務之間進行區分 。
spring session共享,也可以通過在啟動類上聲明@EnableRedisHttpSession進行配置。
例如:@EnableRedisHttpSession(redisNamespace=“xxxx”)
通過在 SpirngBoot 項目中引入Spring Session 和 SpringBoot 整合 Redis 的 start 依賴,我們可以快速搭建分布式 Session 環境,同時也可以在 application.properties 中自定義 Session 的過期時間、命名空間、刷新模式的配置。
具體代碼示例請查看 :
博客的讀者可以通過查看下面倉庫的中的模塊工程名:spring-boot-2.x-spring-session-1 和spring-boot-2.x-spring-session-2
Github:
https://github.com/zhuoqianmingyue/springbootexamples/tree/master/spring-boot-2.x-spring-session-1 (獲取Session)
https://github.com/zhuoqianmingyue/springbootexamples/tree/master/spring-boot-2.x-spring-session-2 (創建Session)
如果您對這些感興趣,歡迎 star、或轉發給予支持!轉發請標明出處!
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态