|
此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Session 3.5.2! |
HttpSession集成
Spring Session 提供与HttpSession.
这意味着开发人员可以将HttpSession使用 Spring Session 支持的实现。
为什么选择Spring Session和HttpSession?
我们已经提到 Spring Session 提供了与HttpSession,但我们从中得到了什么好处呢?
-
集群会话:Spring Session 使支持集群会话变得简单,而无需绑定到特定于应用程序容器的解决方案。
-
RESTful API:Spring Session 允许在标头中提供会话 ID 与 RESTful API 一起使用
HttpSession使用 Redis
将 Spring Session 与HttpSession通过在使用HttpSession.
您可以选择使用以下任一方式启用此功能:
基于 Redis Java 的配置
本节介绍如何使用 Redis 进行备份HttpSession通过使用基于 Java 的配置。
HttpSession 示例提供了如何集成 Spring Session 和HttpSession通过使用 Java 配置。
您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 HttpSession 指南。 |
Spring Java 配置
添加所需的依赖项后,我们可以创建 Spring 配置。
Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。
为此,请添加以下 Spring 配置:
@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 支持的自定义实现。
为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的Config类。
最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。
幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer使这两个步骤都变得简单。
下面显示了一个示例:
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 的配置。
HttpSession XML 示例提供了如何集成 Spring Session 和HttpSession使用 XML 配置。
您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 HttpSession XML 指南。 |
Spring XML 配置
添加所需的依赖项后,我们可以创建 Spring 配置。
Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。
为此,请添加以下 Spring 配置:
(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 支持的自定义实现。
为了我们的Filter为了发挥它的魔力,我们需要指示 Spring 加载session.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配置。
最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。
以下代码段为我们执行了最后一步:
<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被调用。
使用 Mongo 的 HttpSession
将 Spring Session 与HttpSession通过在使用HttpSession.
本节介绍如何使用 Mongo 返回HttpSession使用基于 Java 的配置。
HttpSession Mongo 示例提供了有关如何集成 Spring Session 和HttpSession使用 Java 配置。
您可以阅读下面的集成基本步骤,但建议您在与自己的应用程序集成时遵循详细的 HttpSession 指南。 |
您所要做的就是添加以下 Spring 配置:
@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 Session MongoDB 将使用JdkMongoSessionConverter.
但是,您可以切换到JacksonMongoSessionConverter只需将以下代码添加到启动应用即可:
@Bean
JacksonMongoSessionConverter mongoSessionConverter() {
return new JacksonMongoSessionConverter();
}
JacksonMongoSessionConverter
此机制使用 Jackson 将会话对象序列化为 JSON/从 JSON 序列化。
通过创建以下 bean:
@Bean
JacksonMongoSessionConverter mongoSessionConverter() {
return new JacksonMongoSessionConverter();
}
…您可以从默认(基于 JDK 的序列化)切换到使用 Jackson。
| 如果您要与 Spring Security 集成(通过将会话存储在 MongoDB 中),则此配置将 注册适当的白名单组件,以便 Spring Security 正常工作。 |
如果您想提供自定义 Jackson 模块,您可以通过显式注册模块来实现,如下所示:
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[]
HttpSession使用 JDBC
你可以将 Spring Session 与HttpSession通过在使用HttpSession.
您可以选择通过以下任一方式执行:
JDBC 基于 Java 的配置
本节介绍如何使用关系数据库进行支持HttpSession当您使用基于 Java 的配置时。
HttpSession JDBC 示例提供了如何集成 Spring Session 和HttpSession通过使用 Java 配置。
您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 HttpSession JDBC 指南。 |
Spring Java 配置
添加所需的依赖项后,我们可以创建 Spring 配置。
Spring 配置负责创建一个 Servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。
为此,请添加以下 Spring 配置:
@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 参考文档。
Java Servlet 容器初始化
我们的 Spring 配置创建了一个名为springSessionRepositoryFilter实现Filter.
这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。
为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的Config类。
最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。
幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer使这两个步骤都变得简单。
以下示例显示了如何执行此作:
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 存在于应用程序上下文中。
以下示例显示了如何执行此作:
@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 的配置时。
HttpSession JDBC XML 示例提供了如何集成 Spring Session 和HttpSession通过使用 XML 配置。
您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 HttpSession JDBC XML 指南。 |
Spring XML 配置
添加所需的依赖项后,我们可以创建 Spring 配置。
Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。
以下列表显示了如何添加以下 Spring 配置:
(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 参考文档。
XML Servlet 容器初始化
我们的 Spring 配置创建了一个名为springSessionRepositoryFilter实现Filter.
这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。
为了我们的Filter为了发挥它的魔力,我们需要指示 Spring 加载session.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配置。
最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。
以下代码段为我们执行了最后一步:
<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被调用。
基于 JDBC Spring Boot 的配置
本节介绍如何使用关系数据库进行支持HttpSession当您使用 Spring Boot 时。
HttpSession JDBC Spring Boot 示例提供了如何集成 Spring Session 和HttpSession通过使用 Spring Boot。
您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 HttpSession JDBC Spring Boot 指南。 |
Spring Boot 配置
添加所需的依赖项后,我们可以创建 Spring Boot 配置。 得益于一流的自动配置支持,只需添加依赖项,Spring Boot 就会为我们设置由关系数据库支持的 Spring Session。
如果类路径上存在单个 Spring Session 模块,则 Spring Boot 会自动使用该 store 实现。 如果你有多个实现,则必须选择要用于存储会话的 StoreType,如上所示。
在后台,Spring Boot 应用的配置相当于手动添加@EnableJdbcHttpSession注解。
这将创建一个名为springSessionRepositoryFilter.该 bean 实现Filter.
过滤器负责更换HttpSession由 Spring Session 支持的实现。
您可以使用以下命令进一步自定义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 部分。
配置DataSource
Spring Boot 会自动创建一个DataSource将 Spring Session 连接到 H2 数据库的嵌入式实例。
在生产环境中,您需要更新配置以指向关系数据库。
例如,您可以在 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 文档的配置数据源部分。
Servlet 容器初始化
我们的 Spring Boot 配置创建了一个名为springSessionRepositoryFilter实现Filter.
这springSessionRepositoryFilterbean 负责将HttpSession使用由 Spring Session 支持的自定义实现。
为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的Config类。
最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。
幸运的是,Spring Boot 为我们处理了这两个步骤。
使用 Hazelcast 的 HttpSession
将 Spring Session 与HttpSession通过在使用HttpSession.
本节介绍如何使用 Hazelcast 进行后退HttpSession通过使用基于 Java 的配置。
Hazelcast Spring 示例提供了如何集成 Spring Session 和HttpSession通过使用 Java 配置。
您可以在接下来的几节中阅读集成的基本步骤,但我们鼓励您在与自己的应用程序集成时遵循详细的 Hazelcast Spring 指南。 |
弹簧配置
添加所需的依赖项后,我们可以创建 Spring 配置。
Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。
为此,请添加以下 Spring 配置:
@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 支持的自定义实现。
为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的SessionConfig类。 由于我们的应用程序已经在加载 Spring 配置,因此使用SecurityInitializer类,我们可以将SessionConfigclass 添加到它。以下列表显示了如何执行此作:
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这使得这样做变得如此简单。以下示例显示了如何执行此作:
public class Initializer extends AbstractHttpSessionApplicationInitializer {
}
我们的类的名称 (Initializer)无关紧要。重要的是,我们扩展AbstractHttpSessionApplicationInitializer. |
通过扩展AbstractHttpSessionApplicationInitializer,我们确保 Spring Bean 命名为springSessionRepositoryFilter在 Spring Security 之前的每个请求都注册到我们的 servlet 容器中springSecurityFilterChain.
如何HttpSession集成工程
幸运的是,两者HttpSession和HttpServletRequest(用于获取HttpSession)都是接口。这意味着我们可以为每个 API 提供自己的实现。
本节介绍 Spring Session 如何提供透明的集成HttpSession. 我们提供此内容,以便您了解幕后发生的事情。此功能已经集成,您无需自己实现此逻辑。 |
首先,我们创建一个自定义HttpServletRequest返回自定义实现HttpSession.
它看起来像下面:
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实现。
我们将HttpServletRequest使用 Servlet 实现Filter叫SessionRepositoryFilter.
以下伪代码显示了它的工作原理:
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.
HttpSession和 RESTful API
Spring Session 可以通过让会话在标头中提供来使用 RESTful API。
| REST 示例提供了一个工作示例,说明如何在 REST 应用程序中使用 Spring Session 来支持使用标头进行身份验证。您可以按照接下来几节中描述的基本集成步骤进行作,但我们鼓励您在与自己的应用程序集成时遵循详细的 REST 指南。 |
弹簧配置
添加所需的依赖项后,我们可以创建 Spring 配置。
Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession实现,由 Spring Session 支持的实现。
为此,请添加以下 Spring 配置:
@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 支持的自定义实现。
为了我们的Filter为了发挥它的魔力,Spring 需要加载我们的Config类。
我们在 Spring 中提供了配置MvcInitializer,如以下示例所示:
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { SecurityConfig.class, HttpSessionConfig.class };
}
最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter对于每个请求。
幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer这使得这样做变得容易。为此,请使用默认构造函数扩展类,如以下示例所示:
public class Initializer extends AbstractHttpSessionApplicationInitializer {
}
我们的类的名称 (Initializer)无关紧要。重要的是,我们扩展AbstractHttpSessionApplicationInitializer. |
用HttpSessionListener
Spring Session 支持HttpSessionListener通过翻译SessionDestroyedEvent和SessionCreatedEvent到HttpSessionEvent通过声明SessionEventHttpSessionListenerAdapter.
若要使用此支持,您需要:
-
确保您的
SessionRepository实现支持并配置为触发SessionDestroyedEvent和SessionCreatedEvent. -
配置
SessionEventHttpSessionListenerAdapter作为春豆。 -
注入每个
HttpSessionListener进入SessionEventHttpSessionListenerAdapter
如果您将 Redis 支持enableIndexingAndEvents设置为true,@EnableRedisHttpSession(enableIndexingAndEvents = true),您需要做的就是注册每个HttpSessionListener作为豆子。
例如,假设您想要支持 Spring Security 的并发控制,并且需要使用HttpSessionEventPublisher.在这种情况下,您可以添加HttpSessionEventPublisher作为豆子。
在 Java 配置中,这可能如下所示:
@Configuration
@EnableRedisHttpSession
public class RedisHttpSessionConfig {
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}
// ...
}
在 XML 配置中,这可能如下所示:
<bean class="org.springframework.security.web.session.HttpSessionEventPublisher"/>