在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就是通过这样的思路实现的。

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

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

    作者:简单的土豆 来源:www.jianshu.com/p/e4191997da56 前言 如果你正在使用Java开发Web应用,想必你对HttpSession非常熟悉,但我们知道HpptSessio ...

  2. 使用Spring Session做分布式会话管理

    在Web项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据.通常是由符合session规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效.因此打造一个高可用性的系统,必须将 ...

  3. SpringBoot 2 整合 Spring Session 最简操作

    SpringBoot 2 整合 SpringSession 前言 Spring Session 介绍 SpringBoot 快速整合 Spring Session Spring Session 测试 ...

  4. 在spring MVC项目中集成Spring session redis (使用spring session框架,redis作为存储缓存)...

    2019独角兽企业重金招聘Python工程师标准>>> 1.为项目增加以来  pom.xml中使用 <!-- spring session 单点登录 --> //本项目使 ...

  5. SpringBoot中@Email报错解决

    SpringBoot中@Email报错解决 JSR303校验相关 现象:在springboot中使用@Email注解进行数据校验时,报没有该注解的错误. 解决方法: 在pom.xml中加该配置 < ...

  6. springboot中通过cors协议解决跨域问题

    2019独角兽企业重金招聘Python工程师标准>>> 1.对于前后端分离的项目来说,如果前端项目与后端项目部署在两个不同的域下,那么势必会引起跨域问题的出现. 针对跨域问题,我们可 ...

  7. java分布式会话redis_详解springboot中redis的使用和分布式session共享问题

    对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomca ...

  8. 利用spring session解决共享Session问题

    https://blog.csdn.net/patrickyoung6625/article/details/45694157 1.共享Session问题 HttpSession是通过Servlet容 ...

  9. SpringBoot中操作spring redis的工具类

    场景 SpringBoot+Vue+Redis实现前后端分离的字典缓存机制: https://blog.csdn.net/badao_liumang_qizhi/article/details/108 ...

最新文章

  1. Nutanix助力五矿证券迈向金融混合云2.0
  2. 数组-sort,reverse
  3. UITextField 详解
  4. 高并发编程-Thread_正确关闭线程的三种方式
  5. 新版数采仪问题解决全记录-升级失败问题
  6. python串口通信_python通信串口pyserial安装及常用语句
  7. webservice 出现No service was found
  8. devops 业务模型_如何为DevOps转型建立业务案例
  9. mysql 生成日历表_如何在SQL中创建100年的日历表
  10. 将javascript嵌入项目中
  11. pcie总线连接两台电脑_基于PCIE总线多主互连系统的设计与实现
  12. 计算机 信息安全常识
  13. Eclipse中修改项目的文本字符集编码
  14. c语言程序的书写格式,C语言基础教程:C语言程序书写格式
  15. 4、RH850 F1 定时器OSTM功能和配置
  16. 通过ADB命令打开MTK和展讯日志的方法
  17. 服务器 虚拟软驱,virtual floppy(虚拟软驱)命令行版本
  18. 拍森python百度百科_python对拍_python 拍牌_拍森python - 云+社区 - 腾讯云
  19. C++/MFC修行之路(5)Ribbon(功能区)的使用
  20. python开发管理平台_python开发crm管理系统

热门文章

  1. 使用phpStudy运行伊人集项目
  2. python使用difflib对比文件示例
  3. 数组、字符串对象、Math对象
  4. Java 算法-异或校验和
  5. Tab Bar Animation
  6. TextField输入结束后让键盘消失的两个技巧
  7. 商贸通服装鞋帽版客户端无法连接服务器的问题(自己遇到的,已解决)
  8. 堡垒机高危命令正则表达式
  9. 区块链从一夜暴富到一夜暴“负”的辛酸史
  10. 68-95-99规则–以普通英语解释正态分布