概述

Session用于保存用户信息,通常一个Session保存一个用户信息,在以Tomcat为Servlet Container的web应用中,用户信息都保存在HttpSession中;

当用户发起请求时,都会将SessionId传递过来,服务器根据传递的SessionId就可以找到对应的Session;

HttpSession通常都会保存如下信息:

  1. SessionId:唯一标示;
  2. Session创建时间;
  3. Session过期时间;
  4. Session最近修改时间;
  5. 可以设置Session的一些属性:用于保存User信息;

传统的Session

Session共享的问题

HttpSession通常都会保存在服务器内存中(JVM的堆中),当Session数量变多时,会导致需要大量的JVM堆空间;

因为保存在服务器内存中,当对应用进行横向扩展时,就会导致Session无法共享的问题;

解决方案:将Session存储在外部存储中,比如:redis,mysql中等;

Spring Session

主要特点

  1. 将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的方式;

示例:

  1. 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:

  1. 使用spring.session.store-type=xxx配置,示例:spring.session.store-type=redis
  2. 使用注解方式,示例:@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的使用的更多相关文章

  1. 通过Spring Session实现新一代的Session管理

    长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...

  2. 转:通过Spring Session实现新一代的Session管理

    长期以来,session管理就是企业级Java中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原生云应 ...

  3. 通过 Spring Session 实现新一代的 Session 管理

    长期以来,session 管理就是企业级 Java 中的一部分,以致于我们潜意识就认为它是已经解决的问题,在最近的记忆中,我们没有看到这个领域有很大的革新. 但是,现代的趋势是微服务以及可水平扩展的原 ...

  4. spring session使用日志

    请求进入和退出时,filter触发session的提取和保存   getAttribute时会查询数据库 setAttribute会保存到数据库 daemond线程定时自动删除过期的session s ...

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

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

  6. Spring Session实现分布式session的简单示例

    前面有用 tomcat-redis-session-manager来实现分布式session管理,但是它有一定的局限性,主要是跟tomcat绑定太紧了,这里改成用Spring Session来管理分布 ...

  7. Spring Session + Redis实现分布式Session共享

    发表于 2016-09-29 文章目录 1. Maven依赖 2. 配置Filter 3. Spring配置文件 4. 解决Redis云服务Unable to configure Redis to k ...

  8. 使用Spring Session和Redis解决分布式Session跨域共享问题

    http://blog.csdn.net/xlgen157387/article/details/57406162 使用Spring Session和Redis解决分布式Session跨域共享问题

  9. Spring Session解决分布式Session问题的实现原理

    使用Spring Session和Redis解决分布式Session跨域共享问题 上一篇介绍了如何使用spring Session和Redis解决分布式Session跨域共享问题,介绍了一个简单的案例 ...

  10. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

随机推荐

  1. 20155219实践题目实现od命令

    实践题目 编写MyOD.c 用myod XXX实现Linux下od -tx -tc XXX的功能 od的功能: od命令用于将指定文件内容以八进制.十进制.十六进制.浮点格式或ASCII编码字符方式显 ...

  2. HDU5952 Counting Cliques (暴力深搜+剪枝) (2016ACM/ICPC亚洲赛区沈阳站 Problem E)

    题目链接:传送门 题目: Counting Cliques Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total S ...

  3. lamp 相关

    1.LAMP = linux + apache + mysql(mariadb/mongodb) + php 2.mysql 安装:先下载安装包: wget -c http://mirrors.soh ...

  4. hdu 1864 最大报销额 01背包

    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  5. [P2051 [AHOI2009]中国象棋] DP

    https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...

  6. 安装,配置,启动FTP,SSH,NFS服务

    1.安装,配置,启动FTP服务 sudo apt-get install vsftpd 修改vsftpd的配置文件/etx/vsftpd/.config,将下面几行前面的“#”去掉 #local_en ...

  7. python--json&pickle模块

    六 json&pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用, ...

  8. LG2516 【[HAOI2010]最长公共子序列】

    前言 感觉这几篇仅有的题解都没说清楚,并且有些还是错的,我再发一篇吧. 分析 首先lcs(最长公共子序列)肯定是板子.但这题要求我们不能光记lcs是怎么打的,因为没这部分分,并且另外一个方程的转移要用 ...

  9. Centos7解决中文乱码问题

    查看当前文字编码,发现都是en_US.UTF-8,也就是说还不能完美支持中文编码,如果是zh_CN.UTF-8,那就说明能够比较完美支持中文编码了(我猜的) [root@biaopei ~]# loc ...

  10. 数学与猜想 合情推理模式 (G. 波利亚 著)

    第十二章 几个著名模式 (已看) $1. 证实一个结论 $2. 连续证实几个结论 $3. 证实一个未必可信的结论 $4. 类比推理 $5. 加深类比 $6. 被隐没的类比推理 第十三章 更多的模式与最 ...