使用配置:

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. 安装VMware Workstation时遇到Microsoft Runtime DLL安装程序未能完成安装

    解决:这时不要点确定.开始菜单运行输入‘%temp%’,在弹出的窗体中找到一个文件名中含‘{XXXXXXXXXXXXX}~setup'的文件夹,打开里面会看到有 xxx.msi的,运行就开始vmwar ...

  2. Leetcode之深度优先搜索(DFS)专题-1123. 最深叶节点的最近公共祖先(Lowest Common Ancestor of Deepest Leaves)

    Leetcode之深度优先搜索(DFS)专题-1123. 最深叶节点的最近公共祖先(Lowest Common Ancestor of Deepest Leaves) 深度优先搜索的解题详细介绍,点击 ...

  3. 四种为HttpClient添加默认请求报头的解决方案

    HttpClient在Web调用中具有广泛的应用,而为它添加默认请求头是我们经常遇到的需求,本文介绍4种为HttpClient添加默认请求头的方式. 第一种方式 直接在创建的HttpClient对象的 ...

  4. 图解Nginx限流配置

    本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充. Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读.不过不了解此算法,不影 ...

  5. LeetCode 笔记

    Valid Sudoku 数独整体能够满足的情况是比较复杂.参考:编程之美 关于数独问题的讨论 这道题的解法可能简单一点,因为对输入进行来限制.只是去判断是否是一个数独数独的形式相比较来说也是较简单的 ...

  6. view生命周期

  7. Badboy - variable setter

    参考: http://leafwf.blog.51cto.com/872759/1117646 http://www.51testing.com/html/00/130600-1367743.html ...

  8. 牛客小白月赛5 E 面积 计算三角形面积模板 波尔约-格维也纳定理 匹克公式

    链接:https://www.nowcoder.com/acm/contest/135/E来源:牛客网 题目描述 定义“最大生成图”:在M*N的点阵中,连接一些点形成一条经过所有点恰好一次的回路,且连 ...

  9. Springboot源码分析之代理对象内嵌调用

    摘要: 关于这个话题可能最多的是@Async和@Transactional一起混用,我先解释一下什么是代理对象内嵌调用,指的是一个代理方法调用了同类的另一个代理方法.首先在这儿我要声明事务直接的嵌套调 ...

  10. 数据库常用SQL语句(二):多表连接查询

    前面主要介绍了单表操作时的相关查询语句,接下来介绍一下多表之间的关系,这里主要是多表数据记录的查询,也就是如何在一个查询语句中显示多张表的数据,这也叫多表数据记录的连接查询. 在实现连接查询时,首先是 ...