在SpringBoot中使用Spring Session解决分布式会话共享问题

news/2024/7/9 6:30:28

在SpringBoot中使用Spring Session解决分布式会话共享问题
问题描述:
每次当重启服务器时,都会导致会员平台中已登录的用户掉线。这是因为每个用户的会话信息及状态都是由session来保存的,而session对象是由服务器创建,并把session的Id以cookie的形式发送给客户端浏览器的(每个会话都有一个单独的sessionID)。当这个对象超过一定时间没有被使用或者服务器重启时,对象就会被销毁,也就导致了用户掉线。

解决办法:
在解决问题过程中发现,只要记住了刚才用户的sessionID,重启服务器后仍使用原来的id,就不会掉线,也就是说要保证session不被改变才可以保持用户的登录状态。在这里使用了Spring Session Data Redis来实现session的共享(redis:高速缓存数据库),也就是说使用redis对session进行一个持久化操作(用mysql等数据库来单独存储session有点浪费了,速度也没有redis快),当服务器重启时,可以从redis中反序列化取出session,重新获取用户会话信息。
1.在pom.xml中加入相应依赖
<dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
2.在application.properties加入以下配置
spring.session.store-type=redis
server.servlet.session.timeout=3600
spring.session.redis.flush-mode=on-save
spring.session.redis.namespace=spring:session2


前言
对于一个用java开发的Web应用,HttpSession默认使用内存来管理Session,
如果将应用横向扩展将会出现Session共享问题。Spring Session提供了一套创建和管理Servlet HttpSession的方案,以此来解决Session共享的问题,更为重要的是在Spring Boot中使用它极其简单。

Session共享的问题

HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。如果我们将Web应用横向扩展搭建成分布式的集群,然后利用LVS或Nginx做负载均衡,那么来自同一用户的Http请求将有可能被负载分发到两个不同的实例中去,如何保证不同实例间Session共享成为一个不得不解决的问题。

最简单的解决方法就是把Session数据保存到内存以外的一个统一的地方,例如Memcached/Redis中。那么问题又来了,如何替换掉Servlet容器创建和管理HttpSession的实现呢?

利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略。不过这种方式有个缺点,就是需要耦合Tomcat/Jetty等Servlet容器的代码。这方面其实早就有开源项目了,例如memcached-session-manager,以及tomcat-redis-session-manager。暂时都只支持Tomcat6/Tomcat7。
配置Nginx的负载均衡算法为ip_hash,这样每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的Session共享问题
如果你使用Shiro管理Session,可以用Redis来实现Shiro 的SessionDao接口,这样Session便归Redis保管。
设计一个Filter,利用HttpServletRequestWrapper,实现自己的 getSession()方法,接管创建和管理Session数据的工作。Spring-Session就是通过这样的思路实现的。


 


http://lihuaxi.xjx100.cn/news/244549.html

相关文章

Linux堆内存管理深入分析(上)

Linux堆内存管理深入分析(上半部) 作者&#xff1a;走位阿里聚安全 0 前言 近年来&#xff0c;漏洞挖掘越来越火&#xff0c;各种漏洞挖掘、利用的分析文章层出不穷。从大方向来看&#xff0c;主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种。国内关于栈溢出的资料相对…

BZOJ4245 : [ONTAK2015]OR-XOR

按位考虑&#xff0c;逐步确定答案。 设当前是第i位&#xff0c;求出第i位的前缀异或和。 若存在m个0且所有数字异或和为0&#xff0c;那么答案的这一位可以为0&#xff0c;并把所有1的位置给标记为不可选。 否则答案的这一位只能是1。 时间复杂度$O(n\log n)$。 #include<c…

如何理解jdk8通过行为参数化传递代码

行为参数化可以帮助你处理频繁变更需求的一种软件开发模式。 public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate p){ List<Apple> result new ArrayList<>(); for(Apple apple:inventory){ if(p.te…

linux sar

linux使用sar命令进行系统监视优化 标签&#xff1a; linux磁盘活动systemsolaris任务 2010-12-22 12:50 1304人阅读 评论(0) 收藏 举报 分类&#xff1a;Linux 学习资料&#xff08;53&#xff09; 了解如何将用户抱怨与系统活动报告程序 (SAR) 关联&#xff0c;并使用 S…

jdk8中流的使用(一)

流是java API的新成员&#xff0c;是遍历数据集的高级迭代器&#xff0c;流还可以并行处理&#xff0c;无需写任何多线程代码 流定义&#xff1a;从支持数据处理操作的源生成的元素序列 stream API特点&#xff1a; 1.声明性——更简洁&#xff0c;更易读 2. 可复合——更灵活…

关键词排名下降怎么办-优八学院给你支招

优八学院下面为大家解决一下关于关键词排名下降的问题。在我们进行网站优化的时候&#xff0c;往往会出现关键词排名下降的现象。对于这种情况&#xff0c;我们要区别是否是正常的浮动&#xff0c;由于有时候搜索引擎也会发生错误&#xff0c;导致关键词排名下降&#xff0c;我…

蚂蚁金融科技守护金融安全,蚂蚁风险大脑助阵

摘要&#xff1a;以“数字金融新原力(The New Force of Digital Finance)”为主题&#xff0c;蚂蚁金服ATEC城市峰会于2019年1月4日上海如期举办。金融智能专场分论坛上&#xff0c;蚂蚁金服大安全副总经理王黎强做了主题为《金融科技守护金融安全》的精彩分享。 演讲中&#x…