🧑🎓 个人主页:Silence Lamb
📖 本章内容:【分布式Session解决方案】
📢💨如果文章对你有帮助【关注👍点赞❤️收藏⭐】
🍶分布式session
🌳 session 原理
- session存储在服务端,jsessionId存在客户端,每次通过jsessionid取出保存的数据
- 问题:但是正常情况下session不可跨域(不能跨域共享),它有自己的作用范围
🍨解决方案
🌳 session要能在不同服务和同服务的集群的共享
1️⃣session复制
- 用户登录后得到session后,服务把session也复制到别的机器上,显然这种处理很不好
2️⃣hash一致性
- 根据用户,到指定的机器上登录,但是远程调用还是不好解决
3️⃣redis统一存储
- 最终的选择方案,把session放到redis中
4️⃣SpringSession整合redis
🌳 通过SpringSession修改session的作用域
- 导入依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
- 配置SpringSession
spring.session.store-type=redis
server.servlet.session.timeout=30m
spring.redis.host=********
- 启动类添加注解
@EnableRedisHttpSession
-
配置文件:MySessionConfig
-
自定义 SpringSession 完成 Session 子域共享
@Component
public class MySessionConfig {
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
cookieSerializer.setDomainName("session.com");// 放大作用域
cookieSerializer.setCookieName("SESSION");
cookieSerializer.setCookieMaxAge(60 * 60 * 24 * 7);// 指定cookie有效期7天,会话级关闭浏览器后cookie即失效
return cookieSerializer;
}
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
// 指定session序列化到redis的序列化器
// return new Jackson2JsonRedisSerializer<Object>(Object.class);// 无法保存对象类型,反序列化后默认使用Map封装
return new GenericJackson2JsonRedisSerializer();
}
}
- 登录接口
/**
* @author Silence Lamb
* @apiNote 测试登录
*/
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/session")
public String test(@RequestParam("name") String name, HttpSession session) {
session.setAttribute("name", name);
return name;
}
}
- 以后在用户完成身份校验之后将token信息自动的存储在redis中
- 在分布式部署中可以实现一处登录处处可访问数据资源