使用配置:

1、在pom文件中引入spring-session的jar包

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

2、在web.xml中配置springSessionRepositoryFilter过滤器,虽然引入spring-session的jar包默认会创建一个过滤器。

<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>

3、配置RedisHttpSessionConfiguration

在applicationContext.xml中配置bean

<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<!-- 过期时间30分钟 -->
<property name="maxInactiveIntervalInSeconds" value="1800"></property>

<property name="redisNamespace" value="weijuju-iag-cmb-service-direct"></property>
</bean>

4、使用session.setAttribute保存session时,会保存到redis中。

原理分析

1、session的原理

session是存放在服务器端,是服务器端保存状态的载体。当客户端访问服务器时,服务器根据需求设置session,将会话信息保存在服务器上,同时将session的session_id传递给客户端浏览器,浏览器将这个session_id保存至载体上,过期时间为一次会话有效。浏览器关闭后,这个cookie就过期被清理了。

2、session实现共享的方案

因为session是存放在服务器端的,所以在单节点下,session信息理论上不会丢失,但是在多节点部署应用的环境下,session是不能共享的,就会导致,当用户已经登录后,用户登录的信息已经存放在服务器session中,但是根据特定的负载均衡算法会导致用户每次访问不保证一直访问同一台服务器,所以当用户访问另一台服务器时,实际上是拿不到登录信息的。处理session共享的主要方案有以下两个:

方案1:session复制

既每台服务器上都保存着所有的session信息,该方案采用的是冗余session信息来实现session共享,这种方案在服务器众多时,会有非常大的网络开销。

方案2:session的统一管理实现共享

将多个节点的session统一存放在某个容器中,这个容器推荐使用nosql的redis,因为redis的内存读写快。

3、实现原理

1)通过配置类RedisHttpSessionConfiguration来控制spring-session的参数配置,如session的有效期,redis key的命名空间。

如下:

              <property name="redisNamespace" value="weijuju-iag-cmb-service-direct"></property>

2)在启动web容器后,spring会加载实现了WebApplicationInitializer的类,spring-session包提供了AbstractHttpSessionApplicationInitializer实现了WebApplicationInitializer接口。AbstractHttpSessionApplicationInitializer中的onStartup注册了一个DelegatingFilterProxy的过滤器,实际使用了SessionRepositoryFilter。

3)当浏览器请求携带sessionId时,则会将此值保存到redis中。

4)通过session监听器SessionCreatedEvent、SessionDeletedEvent等等监听session创建和移除等事件来得到session的共享机制。

4、使用限制

不支持跨域操作,适用于单点登录。

分布式session共享机制分析的更多相关文章

  1. 分布式Session共享(二):tomcat+memcached实现session共享

    一.前言 本文主要测试memcached实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port To ...

  2. 分布式Session共享(一):tomcat+redis实现session共享

    一.前言 本文主要测试redis实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port Tomcat ...

  3. Spring Boot(十一)Redis集成从Docker安装到分布式Session共享

    一.简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,Redis也是技术领域使用最为广泛的存储中间件,它是 ...

  4. Spring boot整合redis实现shiro的分布式session共享

    我们知道,shiro是通过SessionManager来管理Session的,而对于Session的操作则是通过SessionDao来实现的,默认的情况下,shiro实现了两种SessionDao,分 ...

  5. 分布式session共享

    一.前言 为什么会出现session共享问题? 客户端与服务器交互时会产生唯一的sessionid用于标记用户,但是在分布式架构中,如果还是采用 session 的方式,用户发起请求,通过 nginx ...

  6. Session Timer机制分析

    Session Timer机制分析 功能介绍 会话初始化协议(SIP)并没有为所建立的会话定义存活机制.尽管用户代理可以通过会话特定的机制判断会话是否超时,但是代理服务器却做不到这点.如此一来,代理服 ...

  7. SpringBoot搭建基于Apache Shiro+Redis的分布式Session共享功能

    我们在上一遍文档中已经完成了Shiro验证功能.(http://www.cnblogs.com/nbfujx/p/7773789.html),在此基础上我们将完成分布式Session共享功能. Red ...

  8. 分布式Session共享解决方案

    分布式Session解决方案 Author:SimpleWu 分布式Session一致性? 说白了就是服务器集群Session共享的问题 Session的作用? Session 是客户端与服务器通讯会 ...

  9. 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案

    分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多 ...

随机推荐

  1. 从强转 byte 说起

    折腾的心,颤抖的手,只因在 main 函数中执行了一次 int 强转 byte 的操作,输出结果太出所料,于是入坑,钻研良久,遂有此篇. 我们都知道,Java中有8中基本数据类型,每种类型都有取值范围 ...

  2. centos 7 修改sshd | 禁止 root登录及脚本定义

    1.新建用户wwweee000 [root@localhost ~]# useradd wwweee000 [root@localhost ~]# passwd wwweee000 Changing ...

  3. Eclipse Paho MQTT Utility

    下载地址: https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho. ...

  4. ZOJ-3872-Beauty of Array-思维

    ZOJ-3872-Beauty of Array 传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3872 参考:ht ...

  5. Leetcode 957.N天后的牢房

    Leetcode 957.N天后的牢房 8间牢房排成一排,每间牢房不是有人住就是空着. 每天,无论牢房是被占用或空置,都会根据以下规则进行更改: 如果一间牢房的两个相邻的房间都被占用或都是空的,那么该 ...

  6. CodeForces 1084D The Fair Nut and the Best Path

    The Fair Nut and the Best Path 题意:求路径上的 点权和 - 边权和 最大, 然后不能存在某个点为负数. 题解: dfs一遍, 求所有儿子走到这个点的最大值和次大值. 我 ...

  7. shell 菜单选择命令

    devices=`adb devices | sed '1d;$d' | sed 's/device//g'`         */sed '1d;$d' : 删除第一行和最后一行*/ device_ ...

  8. Spring Boot2 系列教程(三)理解 Spring Boot 项目中的 parent

    前面和大伙聊了 Spring Boot 项目的三种创建方式,这三种创建方式,无论是哪一种,创建成功后,pom.xml 坐标文件中都有如下一段引用: <parent> <groupId ...

  9. CentOS 7 下网络无法访问 Failed to start LSB: Bring up/.

    [root@localhost Desktop]# ping 192.168.2.1PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.64 byt ...

  10. 如何让C/S应用支持多端(PC、Android、iOS)同时登录?

    在C/S架构中,通常是使用 UserID 作为唯一标志来标记每一个用户的,也就是说,对于一个指定的UserID,只能有一个客户端在线. 如果我们开发的系统要支持同帐号多设备同时登录的场景,即需要像微信 ...