【分布式session】Spring-session的使用
概述
Session用于保存用户信息,通常一个Session保存一个用户信息,在以Tomcat为Servlet Container的web应用中,用户信息都保存在HttpSession中;
当用户发起请求时,都会将SessionId传递过来,服务器根据传递的SessionId就可以找到对应的Session;
HttpSession通常都会保存如下信息:
- SessionId:唯一标示;
- Session创建时间;
- Session过期时间;
- Session最近修改时间;
- 可以设置Session的一些属性:用于保存User信息;
传统的Session
Session共享的问题
HttpSession通常都会保存在服务器内存中(JVM的堆中),当Session数量变多时,会导致需要大量的JVM堆空间;
因为保存在服务器内存中,当对应用进行横向扩展时,就会导致Session无法共享的问题;
解决方案:将Session存储在外部存储中,比如:redis,mysql中等;
Spring Session
主要特点
- 将Session状态保存到外部Session存储中,如 redis,jdbc,mongodb等;
如何创建集群环境下高可用的session
因为使用外部存储方案,可以使用目前成熟的各种数据存储方案,如:redis集群, mysql集群;
Spring Session只需要提供相关接口,能访问底层的数据存储即可,目前Spring Session提供的标准接口如下(针对不同的存储,有不同的实现):
org.springframework.session.Session
接口:
定义了session的基本功能,如设置和移除属性
。这个接口并不关心底层技术,因此能够比servlet HttpSession适用于更为广泛的场景中。org.springframework.session.ExpiringSession
接口:
扩展了Session接口,它提供了判断session是否过期
的属性。RedisSession是这个接口的一个样例实现。org.springframework.session.SessionRepository
接口:
定义了创建、保存、删除以及检索session的方法。
将Session实例真正保存到数据存储的逻辑是在这个接口的实现中编码完成的。
例如,RedisOperationsSessionRepository就是这个接口的一个实现,它会在Redis中创建、存储和删除session。
Session Id如何传输
确定一个用户请求对应的Session,需要使用Session ID
来确定,因此客户端和服务器之间需要协商一种传递session id的方式
;
示例:
- HTTP请求:session可以通过HTTP cookie或HTTP Header信息与请求进行关联;
Spring-Session实现思路
设计一个Filter,利用HttpServletRequestWrapper,实现自己的 getSession()方法,接管创建和管理Session数据的工作。
环境搭建
完整代码参见:Spring-session
Step1: 搭建用于Spring Session的数据存储
Spring Session支持多种不同的后端存储类型(Store-Type),主要包括:
- JDBC
- MONGO
- REDIS
- HAZELCAST
- HASH_MAP :Simple in-memory map of sessions.
本示例中,我们使用Redis集群
作为Spring Session的后端存储,关于如何搭建Redis集群,这里不进行详述;
Step2: 添加Spring Session依赖
因为使用的是Redis集群作为后端存储,所以此处也添加了 redis相关依赖;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Step3: 将Spring Session filter添加到web应用的配置中
通过Spring boot的自动配置来实现,只需要在Spring boot的配置类上使用@EnableRedisHttpSession
注解就可以。
开启,设置失效时间
// 设置了Session的失效时长:
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 300)
// 官方文档的解释:
Add this annotation to an {@code @Configuration} class to expose the
SessionRepositoryFilter as a bean named "springSessionRepositoryFilter" and backed by Redis.
In this instance Spring Session is backed by Redis.
Step4: 配置Spring Session如何选择session数据存储的连接
主要有两种方式选择Store-Type:
- 使用
spring.session.store-type=xxx
配置,示例:spring.session.store-type=redis
; - 使用注解方式,示例:
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 30)
;
当使用redis集群作为Spring Session后端存储时,需要配置Redis连接信息(application.properties):
server.session.timeout=10
spring.redis.host=10.254.9.21
spring.redis.port=30379
源码
参考链接
SpringBoot应用之分布式会话
Spring Session - Spring Boot 官网
Spring Session
【分布式session】Spring-session的使用的更多相关文章
- 通过Spring Session实现新一代的Session管理
长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...
- 转:通过Spring Session实现新一代的Session管理
长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...
- 通过 Spring Session 实现新一代的 Session 管理
长期以来,session 管理就是企业级 Java 中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原 ...
- spring session使用日志
请求进入和退出时,filter触发session的提取和保存 getAttribute时会查询数据库 setAttribute会保存到数据库 daemond线程定时自动删除过期的session s ...
- 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多 ...
- Spring Session实现分布式session的简单示例
前面有用 tomcat-redis-session-manager来实现分布式session管理,但是它有一定的局限性,主要是跟tomcat绑定太紧了,这里改成用Spring Session来管理分布 ...
- Spring Session + Redis实现分布式Session共享
发表于 2016-09-29 文章目录 1. Maven依赖 2. 配置Filter 3. Spring配置文件 4. 解决Redis云服务Unable to configure Redis to k ...
- 使用Spring Session和Redis解决分布式Session跨域共享问题
http://blog.csdn.net/xlgen157387/article/details/57406162 使用Spring Session和Redis解决分布式Session跨域共享问题
- Spring Session解决分布式Session问题的实现原理
使用Spring Session和Redis解决分布式Session跨域共享问题 上一篇介绍了如何使用spring Session和Redis解决分布式Session跨域共享问题,介绍了一个简单的案例 ...
- 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...
随机推荐
- gogs打造自己的git
推荐docker安装 //下载镜像 docker pull gogs/gogs // 创建容器 docker run -d --name=gogs -p 10022:22 -p 3000:3000 - ...
- 第一个程序HelloWorld及常见问题解决和练习
public class hello world{ public static void main(String[] args){ System.out.println(); } } 注意事项: 源文 ...
- 《DSP using MATLAB》Problem 5.27
代码: %% +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Outp ...
- hdu4553 约会安排 线段树
寒假来了,又到了小明和女神们约会的季节. 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会.与此同时,也有很多基友找他开黑,由于数量实 ...
- mysql给数据库授权与收回权限--------dcl
用户授权语法 grant 权限1,权限2... on 数据库名.* to 用户名 @IP地址或% 打开新创建的名为“test”的数据库后 用 show databases; 的命令 看内部的数据结果 ...
- 【java编程】ServiceLoader使用看这一篇就够了
转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...
- Kettle入门--作业和转换的使用
本来想在centos7下部署的,发现因为java版本的问题,无法成功部署,无奈,转到windows平台(后来找到解决方法了,在centos7系统下yum install webkitgtk* -y 就 ...
- C++中的抽象类
一.抽象类学习笔记 1.virtual修饰函数(虚函数)后面加=0就称为一个纯虚函数,一个类中只要有纯虚函数那么它就是一个抽象类.抽象类不能用来实例化对象,是用来给他的派生类定义好这些框架的,给使用这 ...
- 03C++语言对C的增强——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符
1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.C++对c语言register的增强 register关键字 ...
- mysql-8.0.12 安装+配置, Navicat Premium 12 安装+激活
1.解压到安装目录,如:D:\mysql-8.0.12-winx64 2.将以下配置文件粘贴到安装目录,并保存为my.ini,注意:使用ansi 而非utf-8编码格式保存 [mysql] # 设置m ...