4.7. HttpSession & RESTful APIs
Spring Session允许在header中提供会话来与RESTful APIs一起工作。
REST Sample提供了一个在REST应用中如何使用Spring Session支持使用header的身份认证。你可以参考一下基础步骤进行整合,但是在您自己的应用中,推荐遵循详细的REST Guide。
4.7.1. Spring 配置
添加完成必要依赖之后,我们可以创建我们的Spring配置。Spring配置负责创建一个Servlet过滤器,这个过滤器通过一个使用Spring Session支持的实现去替换HttpSession。添加如下的Spring配置:
@Configuration
@EnableRedisHttpSession
public class HttpSessionConfig {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory();
}
@Bean
public HttpSessionStrategy httpSessionStrategy() {
return new HeaderHttpSessionStrategy();
}
}
- @EnableRedisHttpSession 注解创建了一个名为springSessionRepositoryFilter的Bean,这个Bean实现了Filter接口。过滤器负责使用Spring Session支持的一个实现去替换HttpSession,这个实例中Spring Session由Redis支持。
- 我们创建一个RedisConnectionFactory 链接Spring Session和Redis服务器,我们配置的connection是链接到本地机器的默认端口(6379),关于更多关于Spring Data Redis的配置信息,可以参考参考文档
- 我们个性化Spring Session的HttpSession集成使用HTTP头代替cookies来传到当前会话信息。
4.7.2. Servlet容器初始化
我们Spring配置创建了一个名为springSessionRepositoryFilter且实现了Filter。springSessionRepositoryFilter这个Bean呢,主要负责使用Spring Session支持的一个个性化实现来替换HttpSession。
为了让我们的Filter发挥它的魔力,Spring需要加载我们的Config类。在我们的Spring MvcInitializer类中已经提供了这个配置:
src/main/java/sample/mvc/MvcInitializer.java
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { SecurityConfig.class, HttpSessionConfig.class };
}
最后我们需要确保每次请求Servlet容器都使用了springSessionRepositoryFilter。幸运的是,Spring Session提供了一个很有效的名为AbstractHttpSessionApplicationInitializer的类,此类可以很容易的让我们实现确保每次请求Servlet容器都使用了springSessionRepositoryFilter。我们只需要简单的集成这个类并使用它的默认构造函数即可:
src/main/java/sample/Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer {
}
不用关心我们自己的类(Initializer )的名称,我们只需要继承AbstractHttpSessionApplicationInitializer 就行。
4.8. HttpSessionListener
Spring Session支持通过声明SessionEventHttpSessionListenerAdapter将SessionDestroyedEvent和SessionCreatedEvent转化为HttpSessionEvent来支持HttpSessionListener。要使用这个支持,你需要做如下事情:
- 确保SessionRepository实现的支持且被配置成触发SessionDestroyedEvent和SessionCreatedEvent。
- 配置SessionEventHttpSessionListenerAdapter作为Spring Bean.
- 注入每一个HttpSessionListener到SessionEventHttpSessionListenerAdapter
如果你使用的是 HttpSession with Redis的配置支持,之后你需要注册所有的HttpSessionListener作为Bean。比如,假设你想支持Spring Security’s 并发控制且需要使用HttpSessionEventPublisher,你可以简单的添加HttpSessionEventPublisher作为Bean。在Java配置中,看起来如下:
@Configuration
@EnableRedisHttpSession
public class RedisHttpSessionConfig {
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}
// ...
}
在XML配置中,看起来如下:
<bean class="org.springframework.security.web.session.HttpSessionEventPublisher"/>
原文: https://docs.spring.io/spring-session/docs/2.0.0.M4/reference/html5/#httpsession-rest