1、Spring Session-使用Redis的HttpSession
Spring Session 为管理用户的会话信息提供了一些API和实现。一、介绍Spring Session 为管理用户的会话信息提供了一些API和实现。它也提供了与以下组件透明的集成方案:HttpSession:允许在应用程序容器中(如Tomcat)替换HttpSession。
Spring Session 为管理用户的会话信息提供了一些API和实现。
一、介绍
Spring Session 为管理用户的会话信息提供了一些API和实现。它也提供了与以下组件透明的集成方案:
HttpSession:允许在应用程序容器中(如Tomcat)替换HttpSession。附加功能包括:
- 集群Session:Spring Session让其支持集群Session变得不再那么繁琐,也不会受限制于应用程序容器所指定的解决方案。
- 多浏览器Session:Spring Session 支持在一个单独的浏览器实例中管理多个多个用户会话。(例如:类似于Google的多个已认证账户)。
- RESTful APIs:Spring Session允许在header中提供Session ID,以便与RESTful APIs一起使用。
WebSocket:提供当接受到Websocket信息时也能够保持HttpSession活跃的能力。
二、1.3版本新功能
以下是Spring Session1.3版本中的一些新的亮点。你可以通过参考1.3.0.M1版本的变更日志获取完成的新功能列表。 1.3.0.M1,1.3.0 M2,1.3.0 RC1和1.3.0 RELEASE。
- 支持Hazelcast
- 支持Spring安全的一致性会话管理
- 添加了OrientDB社区拓展
- GenericJackson2JsonRedisSerializer示例与Spring Security’s new Jackson的支持。
- 引导使用Lettuce
- spring.session.cleanup.cron.expression 被用来重写清理任务的cron表达式
- 许多性能的提升和bug的修复
三、样例和指南
如果您想开始学习使用Spring Session,最好开始的方式就是我们的样例应用程序。
表1. Spring Boot样例
源码 | 描述 | 指南 |
---|---|---|
HttpSession with Redis | 演示如何使用Spring Session通过Redis替换HttpSession | HttpSession with Redis Guide |
HttpSession with JDBC | 演示如何使用Spring Session通过关系型数据库的存储来替换HttpSession | HttpSession with JDBC Guide |
Find by Username | 演示如何使用Spring Session通过username查找Session | Find by Username Guide |
WebSockets | 演示如何使用Spring Session和Websocket | WebSockets Guide |
HttpSession with Redis JSON serialization | 演示如何使用Spring Session通过Json序列化Redis替换HttpSession | TBD |
表2. 基于Java配置的Spring样例应用
源码 | 描述 | 指南 |
---|---|---|
HttpSession with Redis | 演示如何使用Spring Session通过Redis替换HttpSession | HttpSession with Redis Guide |
HttpSession with JDBC | 演示如何使用Spring Session通过关系型数据库的存储来替换HttpSession | HttpSession with JDBC Guide |
HttpSession with Hazelcast | 演示如何使用Spring Session通过Hazelcast替换HttpSession | HttpSession with JDBC Guide |
Custom Cookie | 演示如何使用Spring Session个性化cookie | Custom Cookie Guide |
Spring Security | 演示如何使用Spring Session和已存在Spring Security应用 | Spring Security Guide |
REST | 演示如何在REST应用程序中使用Spring Session来支持使用Header进行身份认证 | REST Guide |
Multiple Users | 演示如何使用Spring Session来管理多个同时的浏览器会话(如:Google账户) | Multiple Users Guide |
表3. 基于xml配置的Spring样例应用
源码 | 描述 | 指南 |
---|---|---|
HttpSession with Redis | 演示如何使用Spring Session通过Redis替换HttpSession | HttpSession with Redis Guide |
HttpSession with JDBC | 演示如何使用Spring Session通过关系型数据库的存储来替换HttpSession | HttpSession with JDBC Guide |
表4. Misc 样例
源码 | 描述 | 指南 |
---|---|---|
Grails 3 | 演示如何使用Spring Session和Grails 3 | Grails 3 Guide |
Hazelcast | 演示如何在Java EE应用程序中使用Spring Session和Hazelcast | TBD |
四、HttpSession集成
Spring Session提供与HttpSession的透明集成。这意味着开发者可以切换HttpSession的实现到支持Spring Session的实现。
4.1. 为什么是Spring Session&HttpSession?
我们已经提到Spring Session提供与HttpSession的透明集成,但是我们从中能获得什么有益之处呢?
集群Session:Spring Session让其支持集群Session变得不再那么繁琐,也不会受限制于应用程序容器所指定的解决方案。
多浏览器Session:Spring Session 支持在一个单独的浏览器实例中管理多个多个用户会话。(例如:类似于Google的多个已认证账户)。
RESTful APIs:Spring Session允许在header中提供Session ID,以便与RESTful APIs一起工作。
4.2. 使用Redis的HttpSession
在使用HttpSession的任何功能之前通过添加一个Servlet过滤器,就可以启用Spring Session,可以通过如下两种方式进行启用:
- 基于Java的配置
- 基于XML的配置
4.2.1. 基于Java配置Redis
本节介绍基于java的配置来使用Redis返回HttpSession。
HttpSession样例提供了一个可用的样例,这个样例包括了基于java配置如何整合Spring Session和HttpSession。你可以阅读下面的基础整合步骤,但是当您与自己的应用程序整合时,推荐遵循详细的HttpSession指南。
Spring Java配置
添加完必要的依赖之后,我们可以创建我们的Spring配置。Spring配置负责创建一个Servlet过滤器,这个过滤器通过一个使用Spring Session支持的实现去替换HttpSession。添加如下的Spring配置:
@EnableRedisHttpSession
public class Config {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
}
@EnableRedisHttpSession 注解创建了一个名为springSessionRepositoryFilter的Bean,这个Bean实现了Filter接口。过滤器负责使用Spring Session支持的一个实现去替换HttpSession,这个实例中Spring Session由Redis支持。
我们创建一个RedisConnectionFactory 链接Spring Session和Redis服务器,我们配置的connection是链接到本地机器的默认端口(6379),关于更多关于Spring Data Redis的配置信息,可以参考参考文档
Java Servlet容器初始化
我们Spring配置创建了一个名为springSessionRepositoryFilter且实现了Filter。
springSessionRepositoryFilter这个Bean呢,主要负责使用Spring Session支持的一个个性化实现来替换HttpSession。
为了让我们的Filter发挥它的魔力,Spring需要加载我们的Cofig类。最后我们需要确保每次请求Servlet容器都使用了springSessionRepositoryFilter。幸运的是,Spring Session提供了一个很有效的名为AbstractHttpSessionApplicationInitializer的类,使用这个类可以让加载Config类变得非常的容易。例子如下:
public class Initializer extends AbstractHttpSessionApplicationInitializer {
public Initializer() {
super(Config.class);
}
}
我们自己的类(Initializer )的命名我们并不关心,最重要的是要继承AbstractHttpSessionApplicationInitializer。
- 第一步是需要继承AbstractHttpSessionApplicationInitializer。这样可以确保名为springSessionRepositoryFilter 的Spring Bean被注册到Servlet容器中并为每次请求提供处理。
- AbstractHttpSessionApplicationInitializer也提供了一种机制可以非常容易的确保Spring加载Config。
4.2.2. 基于XML配置Redis
本节主要介绍基于XML配置的方式使用Redis返回HttpSession。
HttpSession XML样例提供了一个可用的样例,这个样例包括了基于XML配置的方式如何整合Spring Session和HttpSession。你可以阅读下面的基础整合步骤,但是当您与自己的应用程序整合时,推荐遵循详细的HttpSession XML指南。
Spring XML配置
添加完成必要的依赖之后,我们需要创建我们的Spring配置文件,Spring配置负责创建一个Servlet过滤器,这个过滤器通过一个使用Spring Session支持的实现去替换HttpSession。添加如下的Spring配置:
src/main/webapp/WEB-INF/spring/session.xml(配置文件路径)
<context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>
- 我们使用了context:annotation-config和RedisHttpSessionConfiguration这样一个组合主要是因为Spring Session没有提供XML命名空间的支持。这就创建了一个实现了Filter的名为springSessionRepositoryFilter 的SpringBean。此过滤器负责使用Spring Session支持的一个实现去替换HttpSession,这个实例中Spring Session由Redis支持。
- 我们创建一个RedisConnectionFactory链接Spring Session和Redis服务器,我们配置的connection是链接到本地机器的默认端口(6379),关于更多关于Spring Data Redis的配置信息,可以参考参考文档
XML Servlet 容器初始化
Spring配置文件已经创建了一个实现了Filter的名为springSessionRepositoryFilter 的Bean。
springSessionRepositoryFilter这个Bean呢,主要负责使用Spring Session支持的一个个性化实现来替换HttpSession。
为了让我们的Filter发挥它的魔力,我们需要指示Spring加载我们的session.xml配置文件,我们按照如下配置指示Spring加载session.xml配置文件。
src/main/webapp/WEB-INF/web.xml(配置文件路径)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/*.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
ContextLoaderListener读contextConfigLocation并抽出session.xml配置内容。
最后我们需要确保Servlet容器(如Tomcat)的每个请求都使用了springSessionRepositoryFilter,下面的这个代码片段为我们执行了最后一步:
src/main/webapp/WEB-INF/web.xml(配置文件路径)
<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>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
DelegatingFilterProxy会根据名称springSessionRepositoryFilter去寻找Bean并将其转化成Filter。对于调用DelegatingFilterProxy的每各请求,将调用springSessionRepositoryFilter。
原文:https://docs.spring.io/spring-session/docs/2.0.0.M4/reference/html5/#introduction
更多推荐
所有评论(0)