Spring Session 为管理用户的会话信息提供了一些API和实现。

一、介绍

Spring Session 为管理用户的会话信息提供了一些API和实现。它也提供了与以下组件透明的集成方案:

HttpSession:允许在应用程序容器中(如Tomcat)替换HttpSession。附加功能包括:

  1. 集群Session:Spring Session让其支持集群Session变得不再那么繁琐,也不会受限制于应用程序容器所指定的解决方案。
  2. 多浏览器Session:Spring Session 支持在一个单独的浏览器实例中管理多个多个用户会话。(例如:类似于Google的多个已认证账户)。
  3. 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 RC11.3.0 RELEASE

  1. 支持Hazelcast
  2. 支持Spring安全的一致性会话管理
  3. 添加了OrientDB社区拓展
  4. GenericJackson2JsonRedisSerializer示例与Spring Security’s new Jackson的支持。
  5. 引导使用Lettuce
  6. spring.session.cleanup.cron.expression 被用来重写清理任务的cron表达式
  7. 许多性能的提升和bug的修复

三、样例和指南

如果您想开始学习使用Spring Session,最好开始的方式就是我们的样例应用程序。

表1. Spring Boot样例

源码描述指南
HttpSession with Redis演示如何使用Spring Session通过Redis替换HttpSessionHttpSession with Redis Guide
HttpSession with JDBC演示如何使用Spring Session通过关系型数据库的存储来替换HttpSessionHttpSession with JDBC Guide
Find by Username演示如何使用Spring Session通过username查找SessionFind by Username Guide
WebSockets演示如何使用Spring Session和WebsocketWebSockets Guide
HttpSession with Redis JSON serialization演示如何使用Spring Session通过Json序列化Redis替换HttpSessionTBD

表2. 基于Java配置的Spring样例应用

源码描述指南
HttpSession with Redis演示如何使用Spring Session通过Redis替换HttpSessionHttpSession with Redis Guide
HttpSession with JDBC演示如何使用Spring Session通过关系型数据库的存储来替换HttpSessionHttpSession with JDBC Guide
HttpSession with Hazelcast演示如何使用Spring Session通过Hazelcast替换HttpSessionHttpSession with JDBC Guide
Custom Cookie演示如何使用Spring Session个性化cookieCustom 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替换HttpSessionHttpSession with Redis Guide
HttpSession with JDBC演示如何使用Spring Session通过关系型数据库的存储来替换HttpSessionHttpSession with JDBC Guide

表4. Misc 样例

源码描述指南
Grails 3演示如何使用Spring Session和Grails 3Grails 3 Guide
Hazelcast演示如何在Java EE应用程序中使用Spring Session和HazelcastTBD

四、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,可以通过如下两种方式进行启用:

  1. 基于Java的配置
  2. 基于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。

  1. 第一步是需要继承AbstractHttpSessionApplicationInitializer。这样可以确保名为springSessionRepositoryFilter 的Spring Bean被注册到Servlet容器中并为每次请求提供处理。
  2. 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"/>
  1. 我们使用了context:annotation-config和RedisHttpSessionConfiguration这样一个组合主要是因为Spring Session没有提供XML命名空间的支持。这就创建了一个实现了Filter的名为springSessionRepositoryFilter 的SpringBean。此过滤器负责使用Spring Session支持的一个实现去替换HttpSession,这个实例中Spring Session由Redis支持。
  2. 我们创建一个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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐