xqlee 2773 0 2018-01-02 17:45:12

文章位置:左搜> 编程技术> 正文

一.简介

   spring boot 入门之spring session实现restful apis。通过前面的了解和使用,我们知道可以通过spring boot或者spring mvc整合spring session的方式来实现session的共享达到应用可以水平扩展集群。session默认情况是存了一个cookie在响应的数据里面,然后每次通过cookie来验证session的,但是restful设计中一般不会使用cookie,所以spring session提供了将session id存放在http协议的header中,本文主要讲解如何使用。

二.编码介绍

HttpSession & RESTful APIs

原理:Spring Session 可以允许session在header里面提供来实现RESTful APIs

Spring配置

在创建一个spring boot项目后,加入相关的依赖。现在我们就可以来进行相关配置。这个配置主要负责创建一个servlet Filter替换原有的HttpSession 使用spring session.主要添加以下spring 相关配置:
@Configuration
@EnableRedisHttpSession //①
public class HttpSessionConfig {

        @Bean
        public LettuceConnectionFactory connectionFactory() {
                return new LettuceConnectionFactory(); //②注意,spring boot项目这里不需要创建一个链接工厂,在application配置文件中配置了相关信息会默认生成一个链接工厂供使用。
        }

        @Bean
        public HttpSessionStrategy httpSessionStrategy() {
                return new HeaderHttpSessionStrategy(); //③
        }
}
  ①@EnableRedisHttpSession 注解用来创建一个spring的过滤器类,类的名称为 springSessionRepositoryFilter 这个过滤器用来替换原生的 HttpSession 使用spring session。这个例子中,Spring Session通过Redis来实现存储。
  ②创建了一个RedisConnectionFactory 来使Spring Session链接到Redis Server。关于spring data redis相关配置可以参考之前的spring redis整合。(注意,spring boot项目这里不需要创建一个链接工厂,在application配置文件中配置了相关信息会默认生成一个链接工厂供使用。)
  ③我们自定义了Spring  Session的HttpSession ,将它整合到了HTTP协议的header里面,替换掉默认的放在cookie中。

HttpSessionListener 即session监听处理

Spring Session支持HttpSessionListener,通过将SessionDestroyedEvent 和SessionCreatedEvent转换成 HttpSessionEvent 被定义在SessionEventHttpSessionListenerAdapter来实现。需要使用监听,注意以下几点:
  • 确保你所实现的SessionRepository 支持并且配置到启动SessionDestroyedEvent 和SessionCreatedEvent
  • SessionEventHttpSessionListenerAdapter 配置为spring容器中的一个bean
  • 注入每一个HttpSessionListener 到SessionEventHttpSessionListenerAdapter
如果你使用Redis的方式记录HttpSession,你需要将每一个HttpSessionListener配置为bean。例如,假设你想要支持Spring Security的并发控制,并且需要使用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"/>