作者:admin,发布日期:2021-08-31
阅读:1461;评论:0
在Spring中,session的数据默认是存储在内存中的。但是在目前分布式应用的趋势下,用户的请求可能被负载分发至不同的服务器,此时由于session是存储在内存中,就会导致各个负载之间无法共享session数据,从而导致无法获取到session,但是我们可以将session存储在其他的数据库中来解决这一问题。
Spring Session提供了用于管理用户会话信息的API和实现,同时还使得支持群集会话变得微不足道,而不依赖于特定于应用程序容器的解决方案。
部署方法
这里我们使用redis来存储用户的session以实现共享session
在pom.xml中加入相应的依赖
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
配置完成之后,我们需要修改应用的配置文件,配置redis的连接地址以及其他选项
修改application.yml
spring: redis: host: 127.0.0.1 # 服务器IP password: pass # 连接密码 port: 6739 # 端口
完成之后我们开始编写代码,测试是否可用。
调试测试
在springboot中,我们只需要在application.yml中配置redis的连接信息,剩余部分Spring Boot会交给autoconfigure包下的org.springframework.boot.autoconfigure.session.SessionAutoConfiguration去自动配置相关的bean,我们也可以参考此类自定义相关的bean。
上一步配置完成后,我们开始编写测试controller,在controller中注入HttpSession并增加设置session方法
package com.example.redistest.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpSession; @RestController @RequestMapping("/session") public class HttpSessionController { @Resource private HttpSession session; @RequestMapping("/set") public Object setSession() { session.setAttribute("test", "fanhua"); return "true"; } }
完成后,我们启动程序,访问页面
http://127.0.0.1:8080/session/set
当页面中输出true时,说明配置正常,此时我们可以使用redis管理工具查看相应的key是否创建。
此时可以发现spring session为我们自动在redis中创建了相关的key,内部存储的是我们session写入的内容。
由于我们注入的Bean为HttpSession,所以其他的操作方式与以往相同,无需进行其他的修改,此时共享session配置完成。