前言

  在开发中遇到一个关于用户体验的问题,每次当运维进行更新重启服务器时,都会导致会员平台中已登录的用户掉线。这是因为每个用户的会话信息及状态都是由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加入依赖:spring-session-data-redis、spring-session,当然前提要有spring(4.3.5)、redis的依赖(redis使用了3.0版本)

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.3..RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.3..RELEASE</version>
</dependency>

(2)applicationContext.xml配置文件中增加RedisHttpSessionConfiguration

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" >
<property name="maxIdle" value="" />
<property name="maxTotal" value="" />
<property name="maxWaitMillis" value="" />
<property name="testOnBorrow" value="true" />
</bean> <!-- redis连接配置,依次为主机ip,端口,是否使用池,(usePool=true时)redis的池配置 -->
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
p:host-name="0.0.0.0" p:port="" p:database="" p:pool-config-ref="jedisPoolConfig">
</bean> <!-- 配置spring-session -->
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<!-- 过期时间100分钟 -->
<property name="maxInactiveIntervalInSeconds" value=""></property>
</bean>
</beans>

(3)web.xml中配置filter、session超时时间

<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<!--60*60*24-->
<session-timeout>86400</session-timeout>
</session-config>

配置完成后,基本就可以实现Session的共享了,重启服务器测试,已经登录的用户也不会发生掉线的情况了。

最新文章

  1. 【poj2154】 Color
  2. 给numpy矩阵添加一列
  3. web.xml文件加载顺序
  4. 【转】关于FLASH中图文混排聊天框的小结
  5. nil、Nil、NULL、NSNull的区别
  6. iOS开发之网络编程--1、AFNetwork 3.x 的所有开发中常用基础介绍
  7. jquery与ajax应用
  8. 帝国cms后台不停的登录成功
  9. 浏览器兼容问题系列---使IE支持CSS3 Media Quary
  10. 消息机制 - Windows程序设计(SDK)004
  11. C++ primer学习记录(个人猜想未测试版本)
  12. Thread Dump 和Java应用诊断(转)
  13. Hadoop单机和伪分布式安装
  14. 【转】S3C2440存储系统-SDRAM驱动
  15. Vue 爬坑之路(三)—— 使用 vue-router 跳转页面
  16. C++实现文件内字符数、单词数、行数的统计
  17. Python 新式类与经典类
  18. 20175224 2018-2019-2 《Java程序设计》第二周学习总结
  19. vue-router-transiton
  20. 十一、持久层框架(MyBatis)

热门文章

  1. Web测试方法_01
  2. 前端深入之css篇丨2020年前,彻底掌握css动画
  3. Java的前后端需要了解些什么?
  4. 二叉搜索树倒序O(nlogn)建树
  5. value(C# )
  6. Nginx_Ubuntu
  7. linux命令之import
  8. python 利用 smtplib发邮件
  9. Bootstrap中DropDown插件显示下拉列表,点击下拉列表区域,不会再自动关闭。
  10. java.lang.StackOverflowError解决