该版本仍在开发中,尚未被视为稳定。最新稳定版请使用Spring Session 3.5.3spring-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 SessionHttpSession通过在使用之前添加 Servlet Filter来实现HttpSession. 你可以选择以下方式开启:spring-doc.cadn.net.cn

基于 Java 的 Redis 配置

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

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

Spring Java 配置

添加所需的依赖后,我们可以创建 Spring 配置。 Spring配置负责创建一个servletFilter,以替换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 我们创建一个RedisConnection工厂它将 Spring Session 连接到 Redis 服务器。 我们配置连接连接到默认端口(6379)的本地主机。 有关配置 Spring Data Redis 的更多信息,请参阅参考文档

Java Servlet 容器初始化

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

为了我们的Filter要施展它的魔力,Spring需要加载我们的配置类。 最后,我们需要确保我们的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载荷的机制配置.

基于XML的Redis 配置

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

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

Spring XML 配置

添加所需的依赖后,我们可以创建 Spring 配置。 Spring配置负责创建一个servletFilter,以替换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 我们创建一个RedisConnection工厂它将 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 SessionHttpSession通过在使用之前添加 Servlet Filter来实现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该系统实现了过滤功能。 这个过滤器取代了默认的HttpSession使用MongoDB支持的豆子。
2 将会话超时设置为30分钟。

会话序列化机制

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

默认情况下,Spring SessionMongoDB将使用JdkMongoSession转换器.spring-doc.cadn.net.cn

不过,你可以切换到JacksonMongoSession转换器只需在你的Boot应用中添加以下代码:spring-doc.cadn.net.cn

@Bean
JacksonMongoSessionConverter mongoSessionConverter() {
    return new JacksonMongoSessionConverter();
}
JacksonMongoSession转换器

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

通过制作以下豆子: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[]
JdkMongoSession转换器

JdkMongoSession转换器使用标准 Java 序列化来持久化会话属性,映射到 MongoDB 的二进制形式。 然而,标准会话元素如id、访问时间等仍以普通Mongo对象形式编写,可以无需额外努力地读取和查询。JdkMongoSession转换器如果没有显式摘要MongoSession转换器Bean已经被定义了。spring-doc.cadn.net.cn

还有一个构造子取串行器反串化器这些对象允许你通过自定义实现,这在你想使用非默认的类加载器时尤其重要。spring-doc.cadn.net.cn

HttpSession与JDBC合作

你可以用春季课程HttpSession通过在任何使用HttpSession. 你可以选择以下任一方式:spring-doc.cadn.net.cn

基于 Java 的 JDBC 配置

本节描述如何使用关系型数据库进行备份HttpSession当你使用基于Java的配置时。spring-doc.cadn.net.cn

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

Spring Java 配置

添加所需的依赖后,我们可以创建 Spring 配置。 Spring配置负责创建一个ServletFilter,以替换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. 豆子的实现Filter. 过滤器负责更换HttpSession实施将由Spring Session支持。 在这种情况下,Spring Session 是由关系型数据库支持的。
2 我们创建一个数据来源它将 Spring Session 连接到 H2 数据库的嵌入式实例。 我们通过 Spring Session 中包含的 SQL 脚本配置 H2 数据库来创建数据库表。
3 我们创建一个transactionManager它管理已配置的交易数据来源.

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

Java Servlet 容器初始化

我们的春季配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterBean负责替换HttpSession并采用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter要施展它的魔力,Spring需要加载我们的配置类。 最后,我们需要确保我们的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载荷的机制配置.

多数据源

Spring Session提供@SpringSessionDataSource限定符,允许你明确声明哪一个数据来源豆子应该注射进去JdbcIndexedSessionRepository. 这在多个场景中尤为有用数据来源在应用上下文中出现的豆子。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配置负责创建一个servletFilter,以替换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. 豆子的实现Filter. 过滤器负责更换HttpSession实施将由Spring Session支持。 在这种情况下,Spring Session 是由关系型数据库支持的。
2 我们创建一个数据来源它将 Spring Session 连接到 H2 数据库的嵌入式实例。 我们通过 Spring Session 中包含的 SQL 脚本配置 H2 数据库来创建数据库表。
3 我们创建一个transactionManager它管理已配置的交易数据来源.

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

XML Servlet 容器初始化

我们的春季配置创建了一个名为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 Session。spring-doc.cadn.net.cn

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

在底层,Spring Boot 应用的配置相当于手动添加@EnableJdbcHttpSession注解。 这会形成一种名为springSessionRepositoryFilter.豆子的实现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-doc.cadn.net.cn

配置数据来源

Spring Boot会自动生成数据来源它将 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需要加载我们的配置类。 最后,我们需要确保我们的Servlet容器(即Tomcat)使用我们的springSessionRepositoryFilter每一个请求。 幸运的是,Spring Boot 帮我们解决了这两个步骤。spring-doc.cadn.net.cn

与Hazelcast的HttpSession

使用 Spring SessionHttpSession通过在使用之前添加 Servlet Filter来实现HttpSession.spring-doc.cadn.net.cn

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

Hazelcast 春季样本提供了一个如何整合春季会话的工作示例,HttpSession通过使用 Java 配置。 你可以在接下来的几个章节中阅读整合的基本步骤,但我们鼓励你在与自己的应用集成时,遵循详细的Hazelcast春季指南。

Spring配置

添加所需的依赖后,我们可以创建 Spring 配置。 Spring配置负责创建一个servletFilter,以替换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 为了支持通过主体名称索引检索会话,需要一个合适的价值提取器需要注册。 春季课程提供PrincipalNameExtractor为此目的。
3 为了进行序列化地图会话对象高效,HazelcastSessionSerializer需要注册。如果是这样 未设置,Hazelcast 将使用原生 Java 序列化来序列化会话。
4 我们创建一个Hazelcast实例该项目将春季课程与Hazelcast连接起来。 默认情况下,应用启动并连接到嵌入的 Hazelcast 实例。 有关配置Hazelcast的更多信息,请参阅参考文档
如果HazelcastSessionSerializer优先设置,需要在所有 Hazelcast 集群成员开始前配置好。 在Hazelcast集群中,所有成员会话应使用相同的序列化方法。另外,如果 Hazelcast 客户端/服务器拓扑 如果被使用,则成员和客户端都必须使用相同的序列化方法。串行器可以通过以下方式注册ClientConfig串行器配置成员。

Servlet 容器初始化

我们的春季配置创建了一个名为springSessionRepositoryFilter实现Filter. 这springSessionRepositoryFilterBean负责替换HttpSession并采用由 Spring Session 支持的自定义实现。spring-doc.cadn.net.cn

为了我们的Filter要施展它的魔力,Spring需要加载我们的SessionConfig类。 由于我们的应用已经通过使用 Spring 配置加载安全初始化器类,我们可以添加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在春季安全之前被调用springSecurityFilterChain. 这样做可以确保HttpSessionSpring Security 使用的 Spring Session 是为其后盾。 幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer这让这件事变得非常轻松。 以下示例展示了如何实现:spring-doc.cadn.net.cn

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

}
我们班的名称(初始 化)并不重要。重要的是我们要延展AbstractHttpSessionApplicationInitializer.

通过扩展AbstractHttpSessionApplicationInitializer,我们确保春豆命名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实现为滤波链,我们确保在Filter使用惯例HttpSession实现。 这凸显了为什么Spring Session的重要性SessionRepositoryFilter置于任何与HttpSession.spring-doc.cadn.net.cn

HttpSession以及 RESTful API

Spring Session 可以通过允许会话在头部中提供,从而与 RESTful API 合作。spring-doc.cadn.net.cn

REST 示例提供了一个如何使用 Spring Session 在 REST 应用中支持用头认证的工作示例。 你可以按照接下来几节中描述的集成基础步骤作,但我们鼓励你在与自己的应用集成时,遵循详细的REST指南。

Spring配置

添加所需的依赖后,我们可以创建 Spring 配置。 Spring配置负责创建一个servletFilter,以替换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 我们创建一个RedisConnection工厂它将 Spring Session 连接到 Redis 服务器。 我们配置连接连接到默认端口(6379)的本地主机。 有关配置 Spring Data Redis 的更多信息,请参阅参考文档
3 我们定制了 Spring Session 的 HttpSession 集成,使用HTTP头部来传递当前会话信息,而非Cookie。

Servlet 容器初始化

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

为了我们的Filter要施展它的魔力,Spring需要加载我们的配置类。 我们在春季中提供了配置Mvc初始化器,如下示例所示: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 {

}
我们班的名称(初始 化)并不重要。重要的是我们要延展AbstractHttpSessionApplicationInitializer.

HttpSessionListener

春季课程支持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"/>