SpringBoot:Spring Session共享session(适合同域名同上下文路径) 作者:马育民 • 2020-07-21 17:37 • 阅读:10103 # 同域名同上下文路径 即:同域名同上下文路径,如: http://192.168.1.100:8080/bookmanager http://192.168.1.100:8081/bookmanager ip 或 域名相同,**上下文路径** 相同,端口号是否相同 不影响,这种适合Nginx **集群部署** # 创建springboot工程 # 添加依赖 修改pom.xml文件,增加下面依赖: ``` org.springframework.boot spring-boot-starter-data-redis org.springframework.session spring-session-data-redis ``` # 添加redis配置 修改application.yml文件,增加redis数据库配置 ``` server: port: 8080 spring: redis: host: 106.13.165.xxx port: 6379 password: pwd database: 0 # Redis数据库索引(默认为0) timeout: 5000 # 连接超时时间(毫秒) jedis: pool: max-active: 8 # 连接池最大连接数(使用负值表示没有限制) pool.max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-idle: 8 # 连接池中的最大空闲连接 min-idle: 0 # 连接池中的最小空闲连接 ``` # 创建User类 创建User类,封装登录用户的信息 ``` package top.malaoshi.stdsession.bean; import java.io.Serializable; public class User implements Serializable { private String name; private String sex; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } ``` # 创建测试Controller ``` package top.malaoshi.stdsession.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import top.malaoshi.stdsession.bean.User; import javax.servlet.http.HttpSession; @RestController public class TestSessionController { @GetMapping("set") public String set(HttpSession session){ User user=new User(); user.setName("李雷"); user.setSex("男"); user.setAge(20); session.setAttribute("string","字符串"); session.setAttribute("user",user); return "ok"; } @GetMapping("get") public String get(HttpSession session){ String string=(String)session.getAttribute("string"); User user=(User)session.getAttribute("user"); return String.format("name:%s,sex:%b,age:%s----string:%s",user.getName(),user.getSex(),user.getAge(),string); } } ``` 两个方法,一个向session放入数据,一个从session取数据 # 测试 ### 在idea中启动服务,端口是8081 ### 启动jar服务 在idea中打成jar包, 在jar包同级目录创建配置文件`application.yml`,内容如下: ``` server: port: 8080 spring: redis: host: 106.13.15.23 port: 6379 password: pwd database: 0 # Redis数据库索引(默认为0) timeout: 5000 # 连接超时时间(毫秒) jedis: pool: max-active: 8 # 连接池最大连接数(使用负值表示没有限制) pool.max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-idle: 8 # 连接池中的最大空闲连接 min-idle: 0 # 连接池中的最小空闲连接 ``` 此端口为8080 启动服务:`java -jar xxx.jar` ### 测试8080服务 在浏览器中访问8080服务:http://localhost:8080/set 测试向session放入数据 页面显示内容 和 **cookie** 如下: [![](https://www.malaoshi.top/upload/pic/springsession/QQ20200721-220323.png)](https://www.malaoshi.top/upload/pic/springsession/QQ20200721-220323.png) 此时cookie中的key是`SESSION`,而不是servlet默认的`JSESSIONID` ### 测试8081服务 在浏览器中访问8081服务:http://localhost:8081/get 测试从session取出数据 页面显示内容 和 **cookie** 如下: [![](https://www.malaoshi.top/upload/pic/springsession/QQ20200721-220438.png)](https://www.malaoshi.top/upload/pic/springsession/QQ20200721-220438.png) 此时cookie中的key是`SESSION`,而不是servlet默认的`JSESSIONID`,而且值与8080服务的值相同 ### 查看redis [![](https://www.malaoshi.top/upload/pic/springsession/QQ20200721-221409.png)](https://www.malaoshi.top/upload/pic/springsession/QQ20200721-221409.png) - creationTime :创建时间 - maxInactiveInterval :有效时间 - lastAccessedTime:每次向服务器发请求,都会更新`lastAccessedTime`,否则会session失效 ### 结论 - 在spring session 2.x中,默认开启base64编码,在浏览器cookie中查看的 `SESSION`值,需要base64解密后,才能与redis数据库匹配 - 在2个服务中实现了session共享 原文出处:http://malaoshi.top/show_1EF5viw1JaWt.html