008-分布式Session登录问题

🧑‍🎓 个人主页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中
  • 在分布式部署中可以实现一处登录处处可访问数据资源
    在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silence Lamb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值