对于最新的稳定版本,请使用 Spring Session 3.5.2spring-doc.cadn.net.cn

HttpSession集成

Spring Session 提供与HttpSession. 这意味着开发人员可以将HttpSession使用 Spring Session 支持的实现。spring-doc.cadn.net.cn

为什么选择Spring Session和HttpSession?

我们已经提到 Spring Session 提供了与HttpSession,但我们从中得到了什么好处呢?spring-doc.cadn.net.cn

HttpSession使用 Redis

将 Spring Session 与HttpSession通过在使用HttpSession. 您可以选择使用以下任一方式启用此功能:spring-doc.cadn.net.cn

基于 Redis Java 的配置

本节介绍如何使用 Redis 进行备份HttpSession通过使用基于 Java 的配置。spring-doc.cadn.net.cn

HttpSession 示例提供了如何集成 Spring Session 和HttpSession通过使用 Java 配置。 您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 HttpSession 指南。

Spring Java 配置

添加所需的依赖项后,我们可以创建 Spring 配置。 Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。 为此,请添加以下 Spring 配置:spring-doc.cadn.net.cn

@Configuration(proxyBeanMethods = false)
@EnableRedisHttpSession (1)
public class Config {

	@Bean
	public LettuceConnectionFactory connectionFactory() {
		return new LettuceConnectionFactory(); (2)
	}

}
1 @EnableRedisHttpSession注释创建一个名称为springSessionRepositoryFilter实现Filter. 过滤器负责更换HttpSession由 Spring Session 支持的实现。 在这种情况下,Spring Session 由 Redis 支持。
2 我们创建一个RedisConnectionFactory将 Spring Session 连接到 Redis 服务器。 我们将连接配置为连接到默认端口 (6379) 上的 localhost。 有关配置 Spring Data Redis 的更多信息,请参阅参考文档

Java Servlet 容器初始化

我们的 Spring 配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的Config类。 最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。 幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer使这两个步骤都变得简单。 下面显示了一个示例:spring-doc.cadn.net.cn

src/main/java/sample/Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer { (1)

	public Initializer() {
		super(Config.class); (2)
	}

}
我们的类的名称 (Initializer)无关紧要。重要的是,我们扩展AbstractHttpSessionApplicationInitializer.
1 第一步是延长AbstractHttpSessionApplicationInitializer. 这样做可以确保名为springSessionRepositoryFilter在我们的 Servlet 容器中注册每个请求。
2 AbstractHttpSessionApplicationInitializer还提供了一种机制来确保 Spring 加载我们的Config.

基于 Redis XML 的配置

本节介绍如何使用 Redis 进行备份HttpSession通过使用基于 XML 的配置。spring-doc.cadn.net.cn

HttpSession XML 示例提供了如何集成 Spring Session 和HttpSession使用 XML 配置。 您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 HttpSession XML 指南。

Spring XML 配置

添加所需的依赖项后,我们可以创建 Spring 配置。 Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。 为此,请添加以下 Spring 配置:spring-doc.cadn.net.cn

src/main/webapp/WEB-INF/spring/session.xml
(1)
<context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>

(2)
<bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>
1 我们使用<context:annotation-config/>RedisHttpSessionConfiguration因为 Spring Session 尚未提供 XML 命名空间支持(参见 gh-104)。 这将创建一个名为springSessionRepositoryFilter实现Filter. 过滤器负责更换HttpSession由 Spring Session 支持的实现。 在这种情况下,Spring Session 由 Redis 支持。
2 我们创建一个RedisConnectionFactory将 Spring Session 连接到 Redis 服务器。 我们将连接配置为连接到默认端口 (6379) 上的本地主机 有关配置 Spring Data Redis 的更多信息,请参阅参考文档

XML Servlet 容器初始化

我们的 Spring 配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter为了发挥它的魔力,我们需要指示 Spring 加载session.xml配置。 我们可以通过以下配置来做到这一点:spring-doc.cadn.net.cn

src/main/webapp/WEB-INF/web.xml
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		/WEB-INF/spring/session.xml
	</param-value>
</context-param>
<listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
</listener>

ContextLoaderListener读取 contextConfigLocation 并获取我们的session.xml配置。spring-doc.cadn.net.cn

最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。 以下代码段为我们执行了最后一步:spring-doc.cadn.net.cn

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并将其转换为Filter. 对于每个请求DelegatingFilterProxy被调用时,springSessionRepositoryFilter被调用。spring-doc.cadn.net.cn

使用 Mongo 的 HttpSession

将 Spring Session 与HttpSession通过在使用HttpSession.spring-doc.cadn.net.cn

本节介绍如何使用 Mongo 返回HttpSession使用基于 Java 的配置。spring-doc.cadn.net.cn

HttpSession Mongo 示例提供了有关如何集成 Spring Session 和HttpSession使用 Java 配置。 您可以阅读下面的集成基本步骤,但建议您在与自己的应用程序集成时遵循详细的 HttpSession 指南。

您所要做的就是添加以下 Spring 配置:spring-doc.cadn.net.cn

@Configuration(proxyBeanMethods = false)
@EnableMongoHttpSession (1)
public class HttpSessionConfig {

	@Bean
	public JdkMongoSessionConverter jdkMongoSessionConverter() {
		return new JdkMongoSessionConverter(Duration.ofMinutes(30)); (2)
	}

}
1 @EnableMongoHttpSession注释创建一个名称为springSessionRepositoryFilter实现 Filter 的。 此过滤器取代了默认的HttpSession使用 MongoDB 支持的 bean。
2 将会话超时配置为 30 分钟。

会话序列化机制

为了能够在 MongoDB 中持久化会话对象,我们需要提供序列化/反序列化机制。spring-doc.cadn.net.cn

默认情况下,Spring Session MongoDB 将使用JdkMongoSessionConverter.spring-doc.cadn.net.cn

但是,您可以切换到JacksonMongoSessionConverter只需将以下代码添加到启动应用即可:spring-doc.cadn.net.cn

@Bean
JacksonMongoSessionConverter mongoSessionConverter() {
    return new JacksonMongoSessionConverter();
}
JacksonMongoSessionConverter

此机制使用 Jackson 将会话对象序列化为 JSON/从 JSON 序列化。spring-doc.cadn.net.cn

通过创建以下 bean:spring-doc.cadn.net.cn

@Bean
JacksonMongoSessionConverter mongoSessionConverter() {
    return new JacksonMongoSessionConverter();
}

…​您可以从默认(基于 JDK 的序列化)切换到使用 Jackson。spring-doc.cadn.net.cn

如果您要与 Spring Security 集成(通过将会话存储在 MongoDB 中),则此配置将 注册适当的白名单组件,以便 Spring Security 正常工作。

如果您想提供自定义 Jackson 模块,您可以通过显式注册模块来实现,如下所示:spring-doc.cadn.net.cn

Unresolved include directive in modules/ROOT/pages/http-session.adoc - include::example$spring-session-data-mongodb-dir/src/integration-test/java/org/springframework/session/data/mongo/integration/MongoRepositoryJacksonITest.java[]
JdkMongo会话转换器

JdkMongoSessionConverter使用标准 Java 序列化以二进制形式持久化映射到 MongoDB 的会话属性。 但是,标准会话元素(如 id、访问时间等)仍然被写成普通的 Mongo 对象,并且无需额外努力即可读取和查询。JdkMongoSessionConverter如果没有显式AbstractMongoSessionConverterBean 已被定义。spring-doc.cadn.net.cn

还有一个构造函数,将SerializerDeserializer对象,允许您传递自定义实现,当您想使用非默认类加载器时,这一点尤为重要。spring-doc.cadn.net.cn

HttpSession使用 JDBC

你可以将 Spring Session 与HttpSession通过在使用HttpSession. 您可以选择通过以下任一方式执行:spring-doc.cadn.net.cn

JDBC 基于 Java 的配置

本节介绍如何使用关系数据库进行支持HttpSession当您使用基于 Java 的配置时。spring-doc.cadn.net.cn

HttpSession JDBC 示例提供了如何集成 Spring Session 和HttpSession通过使用 Java 配置。 您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 HttpSession JDBC 指南。

Spring Java 配置

添加所需的依赖项后,我们可以创建 Spring 配置。 Spring 配置负责创建一个 Servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。 为此,请添加以下 Spring 配置:spring-doc.cadn.net.cn

@Configuration(proxyBeanMethods = false)
@EnableJdbcHttpSession (1)
public class Config {

	@Bean
	public EmbeddedDatabase dataSource() {
		return new EmbeddedDatabaseBuilder() (2)
			.setType(EmbeddedDatabaseType.H2)
			.addScript("org/springframework/session/jdbc/schema-h2.sql")
			.build();
	}

	@Bean
	public PlatformTransactionManager transactionManager(DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource); (3)
	}

}
1 @EnableJdbcHttpSession注释创建一个名称为springSessionRepositoryFilter. 该 bean 实现Filter. 过滤器负责更换HttpSession由 Spring Session 支持的实现。 在这种情况下,Spring Session 由关系数据库支持。
2 我们创建一个dataSource将 Spring Session 连接到 H2 数据库的嵌入式实例。 我们使用 Spring Session 中包含的 SQL 脚本配置 H2 数据库以创建数据库表。
3 我们创建一个transactionManager管理先前配置的事务dataSource.

有关如何配置数据访问相关问题的更多信息,请参阅 Spring Framework 参考文档spring-doc.cadn.net.cn

Java Servlet 容器初始化

我们的 Spring 配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的Config类。 最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。 幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer使这两个步骤都变得简单。 以下示例显示了如何执行此作:spring-doc.cadn.net.cn

src/main/java/sample/Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer { (1)

	public Initializer() {
		super(Config.class); (2)
	}

}
我们的类的名称(初始值设定项)并不重要。 重要的是,我们扩展AbstractHttpSessionApplicationInitializer.
1 第一步是延长AbstractHttpSessionApplicationInitializer. 这样做可以确保名为springSessionRepositoryFilter在我们的 Servlet 容器中注册每个请求。
2 AbstractHttpSessionApplicationInitializer还提供了一种机制来确保 Spring 加载我们的Config.

多个数据源

Spring Session 提供了@SpringSessionDataSource限定符,允许您显式声明哪个DataSource豆子应该注入JdbcIndexedSessionRepository. 这在具有多个DataSourcebean 存在于应用程序上下文中。spring-doc.cadn.net.cn

以下示例显示了如何执行此作:spring-doc.cadn.net.cn

Config.java
@EnableJdbcHttpSession
public class Config {

	@Bean
	@SpringSessionDataSource (1)
	public EmbeddedDatabase firstDataSource() {
		return new EmbeddedDatabaseBuilder()
				.setType(EmbeddedDatabaseType.H2).addScript("org/springframework/session/jdbc/schema-h2.sql").build();
	}

	@Bean
	public HikariDataSource secondDataSource() {
		// ...
	}
}
1 此限定符声明 firstDataSource 将由 Spring Session 使用。

基于 XML 的 JDBC 配置

本节介绍如何使用关系数据库进行支持HttpSession当您使用基于 XML 的配置时。spring-doc.cadn.net.cn

HttpSession JDBC XML 示例提供了如何集成 Spring Session 和HttpSession通过使用 XML 配置。 您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 HttpSession JDBC XML 指南。

Spring XML 配置

添加所需的依赖项后,我们可以创建 Spring 配置。 Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。 以下列表显示了如何添加以下 Spring 配置:spring-doc.cadn.net.cn

src/main/webapp/WEB-INF/spring/session.xml
(1)
<context:annotation-config/>
<bean class="org.springframework.session.jdbc.config.annotation.web.http.JdbcHttpSessionConfiguration"/>

(2)
<jdbc:embedded-database id="dataSource" database-name="testdb" type="H2">
	<jdbc:script location="classpath:org/springframework/session/jdbc/schema-h2.sql"/>
</jdbc:embedded-database>

(3)
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<constructor-arg ref="dataSource"/>
</bean>
1 我们使用<context:annotation-config/>JdbcHttpSessionConfiguration因为 Spring Session 尚未提供 XML 命名空间支持(参见 gh-104)。 这将创建一个名为springSessionRepositoryFilter. 该 bean 实现Filter. 过滤器负责更换HttpSession由 Spring Session 支持的实现。 在这种情况下,Spring Session 由关系数据库支持。
2 我们创建一个dataSource将 Spring Session 连接到 H2 数据库的嵌入式实例。 我们使用 Spring Session 中包含的 SQL 脚本配置 H2 数据库以创建数据库表。
3 我们创建一个transactionManager管理先前配置的事务dataSource.

有关如何配置与数据访问相关的问题的更多信息,请参阅 Spring Framework 参考文档spring-doc.cadn.net.cn

XML Servlet 容器初始化

我们的 Spring 配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter为了发挥它的魔力,我们需要指示 Spring 加载session.xml配置。 我们通过以下配置来做到这一点:spring-doc.cadn.net.cn

src/main/webapp/WEB-INF/web.xml
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>
		/WEB-INF/spring/session.xml
	</param-value>
</context-param>
<listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
</listener>

ContextLoaderListener读取contextConfigLocation并选择我们的session.xml配置。spring-doc.cadn.net.cn

最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。 以下代码段为我们执行了最后一步:spring-doc.cadn.net.cn

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并将其转换为Filter. 对于每个请求,其中DelegatingFilterProxy被调用时,springSessionRepositoryFilter被调用。spring-doc.cadn.net.cn

基于 JDBC Spring Boot 的配置

本节介绍如何使用关系数据库进行支持HttpSession当您使用 Spring Boot 时。spring-doc.cadn.net.cn

HttpSession JDBC Spring Boot 示例提供了如何集成 Spring Session 和HttpSession通过使用 Spring Boot。 您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 HttpSession JDBC Spring Boot 指南。

Spring Boot 配置

添加所需的依赖项后,我们可以创建 Spring Boot 配置。 得益于一流的自动配置支持,只需添加依赖项,Spring Boot 就会为我们设置由关系数据库支持的 Spring Session。spring-doc.cadn.net.cn

如果类路径上存在单个 Spring Session 模块,则 Spring Boot 会自动使用该 store 实现。 如果你有多个实现,则必须选择要用于存储会话的 StoreType,如上所示。spring-doc.cadn.net.cn

在后台,Spring Boot 应用的配置相当于手动添加@EnableJdbcHttpSession注解。 这将创建一个名为springSessionRepositoryFilter.该 bean 实现Filter. 过滤器负责更换HttpSession由 Spring Session 支持的实现。spring-doc.cadn.net.cn

您可以使用以下命令进一步自定义application.properties. 以下列表显示了如何执行此作:spring-doc.cadn.net.cn

src/main/resources/application.properties
server.servlet.session.timeout= # Session timeout. If a duration suffix is not specified, seconds are used.
spring.session.jdbc.initialize-schema=embedded # Database schema initialization mode.
spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
spring.session.jdbc.table-name=SPRING_SESSION # Name of the database table used to store sessions.

有关更多信息,请参阅 Spring Boot 文档的 Spring Session 部分。spring-doc.cadn.net.cn

配置DataSource

Spring Boot 会自动创建一个DataSource将 Spring Session 连接到 H2 数据库的嵌入式实例。 在生产环境中,您需要更新配置以指向关系数据库。 例如,您可以在 application.properties 中包含以下内容:spring-doc.cadn.net.cn

src/main/resources/application.properties
spring.datasource.url= # JDBC URL of the database.
spring.datasource.username= # Login username of the database.
spring.datasource.password= # Login password of the database.

有关更多信息,请参阅 Spring Boot 文档的配置数据源部分。spring-doc.cadn.net.cn

Servlet 容器初始化

我们的 Spring Boot 配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的Config类。 最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。 幸运的是,Spring Boot 为我们处理了这两个步骤。spring-doc.cadn.net.cn

使用 Hazelcast 的 HttpSession

将 Spring Session 与HttpSession通过在使用HttpSession.spring-doc.cadn.net.cn

本节介绍如何使用 Hazelcast 进行后退HttpSession通过使用基于 Java 的配置。spring-doc.cadn.net.cn

Hazelcast Spring 示例提供了如何集成 Spring Session 和HttpSession通过使用 Java 配置。 您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 Hazelcast Spring 指南。

弹簧配置

添加所需的依赖项后,我们可以创建 Spring 配置。 Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。 为此,请添加以下 Spring 配置:spring-doc.cadn.net.cn

@EnableHazelcastHttpSession (1)
@Configuration
public class HazelcastHttpSessionConfig {

	@Bean
	public HazelcastInstance hazelcastInstance() {
		Config config = new Config();
		AttributeConfig attributeConfig = new AttributeConfig()
			.setName(HazelcastIndexedSessionRepository.PRINCIPAL_NAME_ATTRIBUTE)
			.setExtractorClassName(PrincipalNameExtractor.class.getName());
		config.getMapConfig(HazelcastIndexedSessionRepository.DEFAULT_SESSION_MAP_NAME) (2)
			.addAttributeConfig(attributeConfig)
			.addIndexConfig(
					new IndexConfig(IndexType.HASH, HazelcastIndexedSessionRepository.PRINCIPAL_NAME_ATTRIBUTE));
		SerializerConfig serializerConfig = new SerializerConfig();
		serializerConfig.setImplementation(new HazelcastSessionSerializer()).setTypeClass(MapSession.class);
		config.getSerializationConfig().addSerializerConfig(serializerConfig); (3)
		return Hazelcast.newHazelcastInstance(config); (4)
	}

}
1 @EnableHazelcastHttpSession注释创建一个名为springSessionRepositoryFilter实现Filter. 过滤器负责更换HttpSession由 Spring Session 支持的实现。 在这种情况下,Spring Session 由 Hazelcast 支持。
2 为了支持按主体名称索引检索会话,适当的ValueExtractor需要注册。 Spring Session 提供PrincipalNameExtractor为此目的。
3 为了序列化MapSession高效对象,HazelcastSessionSerializer需要注册。如果这 未设置,则 Hazelcast 将使用本机 Java 序列化序列化会话。
4 我们创建一个HazelcastInstance将 Spring Session 连接到 Hazelcast。 默认情况下,应用程序启动并连接到 Hazelcast 的嵌入式实例。 有关配置 Hazelcast 的更多信息,请参阅参考文档
如果HazelcastSessionSerializer是首选,则需要在启动之前为所有 Hazelcast 集群成员配置它。 在 Hazelcast 群集中,所有成员都应对会话使用相同的序列化方法。此外,如果 Hazelcast 客户端/服务器拓扑 ,则成员和客户端都必须使用相同的序列化方法。序列化程序可以通过以下方式注册ClientConfig与相同的SerializerConfiguration成员。

Servlet 容器初始化

我们的 Spring 配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的SessionConfig类。 由于我们的应用程序已经在加载 Spring 配置,因此使用SecurityInitializer类,我们可以将SessionConfig班级。 以下列表显示了如何执行此作:spring-doc.cadn.net.cn

src/main/java/sample/SecurityInitializer.java
public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {

	public SecurityInitializer() {
		super(SecurityConfig.class, SessionConfig.class);
	}

}

最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。 Spring Session的springSessionRepositoryFilter在 Spring Security 的springSecurityFilterChain. 这样做可以确保HttpSessionSpring Security 使用的由 Spring Session 支持。 幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer这使得这样做变得如此容易。 以下示例显示了如何执行此作:spring-doc.cadn.net.cn

src/main/java/sample/Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer {

}
我们的类的名称 (Initializer)无关紧要。重要的是,我们扩展AbstractHttpSessionApplicationInitializer.

通过扩展AbstractHttpSessionApplicationInitializer,我们确保 Spring Bean 命名为springSessionRepositoryFilter在 Spring Security 之前的每个请求都注册到我们的 servlet 容器中springSecurityFilterChain.spring-doc.cadn.net.cn

如何HttpSession集成工程

幸运的是,两者HttpSessionHttpServletRequest(用于获取HttpSession)都是接口。 这意味着我们可以为每个 API 提供自己的实现。spring-doc.cadn.net.cn

本节介绍 Spring Session 如何提供透明的集成HttpSession.我们提供此内容是为了让您了解幕后发生的事情。此功能已集成,您无需自己实现此逻辑。

首先,我们创建一个自定义HttpServletRequest返回自定义实现HttpSession. 它看起来像下面:spring-doc.cadn.net.cn

public class SessionRepositoryRequestWrapper extends HttpServletRequestWrapper {

	public SessionRepositoryRequestWrapper(HttpServletRequest original) {
		super(original);
	}

	public HttpSession getSession() {
		return getSession(true);
	}

	public HttpSession getSession(boolean createNew) {
		// create an HttpSession implementation from Spring Session
	}

	// ... other methods delegate to the original HttpServletRequest ...
}

任何返回HttpSession被覆盖。 所有其他方法都由HttpServletRequestWrapper并委托给原件HttpServletRequest实现。spring-doc.cadn.net.cn

我们将HttpServletRequest使用 Servlet 实现FilterSessionRepositoryFilter. 以下伪代码显示了它的工作原理:spring-doc.cadn.net.cn

public class SessionRepositoryFilter implements Filter {

	public doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		SessionRepositoryRequestWrapper customRequest =
			new SessionRepositoryRequestWrapper(httpRequest);

		chain.doFilter(customRequest, response, chain);
	}

	// ...
}

通过传递自定义HttpServletRequest实现到FilterChain,我们确保在Filter使用自定义HttpSession实现。 这凸显了为什么Spring Session的SessionRepositoryFilter放置在与HttpSession.spring-doc.cadn.net.cn

HttpSession和 RESTful API

Spring Session 可以通过让会话在标头中提供来使用 RESTful API。spring-doc.cadn.net.cn

REST 示例提供了一个工作示例,说明如何在 REST 应用程序中使用 Spring Session 来支持使用标头进行身份验证。您可以按照接下来几节中描述的基本集成步骤进行作,但我们鼓励您在与自己的应用程序集成时遵循详细的 REST 指南。

弹簧配置

添加所需的依赖项后,我们可以创建 Spring 配置。 Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。 为此,请添加以下 Spring 配置:spring-doc.cadn.net.cn

@Configuration
@EnableRedisHttpSession (1)
public class HttpSessionConfig {

	@Bean
	public LettuceConnectionFactory connectionFactory() {
		return new LettuceConnectionFactory(); (2)
	}

	@Bean
	public HttpSessionIdResolver httpSessionIdResolver() {
		return HeaderHttpSessionIdResolver.xAuthToken(); (3)
	}

}
1 @EnableRedisHttpSession注释创建一个名为springSessionRepositoryFilter实现Filter. 过滤器负责更换HttpSession由 Spring Session 支持的实现。 在这种情况下,Spring Session 由 Redis 支持。
2 我们创建一个RedisConnectionFactory将 Spring Session 连接到 Redis 服务器。 我们将连接配置为连接到默认端口 (6379) 上的 localhost。 有关配置 Spring Data Redis 的更多信息,请参阅参考文档
3 我们自定义 Spring Session 的 HttpSession 集成,以使用 HTTP 标头来传达当前会话信息而不是 cookie。

Servlet 容器初始化

我们的 Spring 配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的Config类。 我们在 Spring 中提供了配置MvcInitializer,如以下示例所示:spring-doc.cadn.net.cn

src/main/java/sample/mvc/MvcInitializer.java
@Override
protected Class<?>[] getRootConfigClasses() {
	return new Class[] { SecurityConfig.class, HttpSessionConfig.class };
}

最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。 幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer这使得这样做变得容易。为此,请使用默认构造函数扩展类,如以下示例所示:spring-doc.cadn.net.cn

src/main/java/sample/Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer {

}
我们的类的名称 (Initializer)无关紧要。重要的是,我们扩展AbstractHttpSessionApplicationInitializer.

HttpSessionListener

Spring Session 支持HttpSessionListener通过翻译SessionDestroyedEventSessionCreatedEventHttpSessionEvent通过声明SessionEventHttpSessionListenerAdapter. 若要使用此支持,您需要:spring-doc.cadn.net.cn

如果您将 Redis 支持enableIndexingAndEvents设置为true,@EnableRedisHttpSession(enableIndexingAndEvents = true),您需要做的就是注册每个HttpSessionListener作为豆子。 例如,假设您想要支持 Spring Security 的并发控制,并且需要使用HttpSessionEventPublisher.在这种情况下,您可以添加HttpSessionEventPublisher作为豆子。 在 Java 配置中,这可能如下所示:spring-doc.cadn.net.cn

@Configuration
@EnableRedisHttpSession
public class RedisHttpSessionConfig {

	@Bean
	public HttpSessionEventPublisher httpSessionEventPublisher() {
		return new HttpSessionEventPublisher();
	}

	// ...

}

在 XML 配置中,这可能如下所示:spring-doc.cadn.net.cn

<bean class="org.springframework.security.web.session.HttpSessionEventPublisher"/>