分布式session共享机制分析
使用配置:
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共享机制分析的更多相关文章
- 分布式Session共享(二):tomcat+memcached实现session共享
一.前言 本文主要测试memcached实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port To ...
- 分布式Session共享(一):tomcat+redis实现session共享
一.前言 本文主要测试redis实现session共享的实现方式,不讨论如何让nginx参与实现负载均衡等. 二.环境配置 本测试在Window下进行 name version port Tomcat ...
- Spring Boot(十一)Redis集成从Docker安装到分布式Session共享
一.简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API,Redis也是技术领域使用最为广泛的存储中间件,它是 ...
- Spring boot整合redis实现shiro的分布式session共享
我们知道,shiro是通过SessionManager来管理Session的,而对于Session的操作则是通过SessionDao来实现的,默认的情况下,shiro实现了两种SessionDao,分 ...
- 分布式session共享
一.前言 为什么会出现session共享问题? 客户端与服务器交互时会产生唯一的sessionid用于标记用户,但是在分布式架构中,如果还是采用 session 的方式,用户发起请求,通过 nginx ...
- Session Timer机制分析
Session Timer机制分析 功能介绍 会话初始化协议(SIP)并没有为所建立的会话定义存活机制.尽管用户代理可以通过会话特定的机制判断会话是否超时,但是代理服务器却做不到这点.如此一来,代理服 ...
- SpringBoot搭建基于Apache Shiro+Redis的分布式Session共享功能
我们在上一遍文档中已经完成了Shiro验证功能.(http://www.cnblogs.com/nbfujx/p/7773789.html),在此基础上我们将完成分布式Session共享功能. Red ...
- 分布式Session共享解决方案
分布式Session解决方案 Author:SimpleWu 分布式Session一致性? 说白了就是服务器集群Session共享的问题 Session的作用? Session 是客户端与服务器通讯会 ...
- 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多 ...
随机推荐
- Spring学习之旅(五)--AOP
什么是 AOP AOP(Aspect-OrientedProgramming,面向方面编程),可以说是 OOP(Object-Oriented Programing,面向对象编程)的补充和完善. OO ...
- python学习——列表和元组
一.列表 1)列表介绍 列表是Python内置的一种数据类型. >一组有序项目的集合(从第一个成员序号为0开始依次递增排序) >可变的数据类型(可进行增删改查) >列表中可以包含任何 ...
- Java网络编程之URL和URI
Java网络编程之URL与URI 一.URL与URI简介 URI = Universal Resource Identifier 统一资源标志符 URL = Universal Resource Lo ...
- 带你入门SpringCloud服务发现 | Eurka搭建和使用
前言 服务注册与发现是微服务中最为基础的环节,而 Eureka 就是一个可以帮助你实现服务注册与发现的选择之一.如果你对 Eureka 和服务发现了解甚少,那么该篇博客将会帮助到你.文中通过具体操作带 ...
- Jenkins教程(三)添加凭据与流水线拉取Git代码
前言 本文旨在配置凭据.使用Git仓库中的Jenkinsfile与使用声明式流水线拉取Git代码 使用SVN等其他版本控制工具,请参考使用Pipeline-Syntax生成对应代码块 凭据(crede ...
- Win10下安装python3.x+pycharm+autopep8
一.安装Python3.X 1.Pythong官方网站:http://python.org/getit/ 下载windows的安装包.有以下几个选项: 这里选择windows x86-64 exc ...
- 2019 Multi-University Training Contest 5
2019 Multi-University Training Contest 5 A. fraction upsolved 题意 输入 \(x,p\),输出最小的 \(b\) 使得 \(bx\%p&l ...
- Codeforces Round #481 (Div. 3) A. Remove Duplicates
题目地址:http://codeforces.com/contest/978/problem/A 题解:给一串长度为n的数组,然后删去相同的数字(从右往左). 方法:题目n和数组ai给的范围都很小,所 ...
- 刨死你系列——LinkedHashMap剖析(基于jdk1.8)
一.概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linked ...
- 题解 洛谷P5259【欧稳欧再次学车】
实际上没什么可说的,暴力大模拟就好. 一定要开long long! 一定要开long long! 一定要开long long! (不然会炸数据的!!!) //Stand up for the fait ...