谷粒商城SpringSession(三十五)
225-230
在官网上截了2个片段,具体如下:
5. HttpSession Integration
Spring Session 使用
HttpSession
提供透明的 integration。这意味着开发人员可以使用 Spring Session 支持的 implementation 切换HttpSession
implementation。5.1 为什么 Spring Session&HttpSession?
我们已经提到 Spring Session 为
HttpSession
提供了透明的 integration,但是我们从中得到了什么好处呢?
- 集群会话 - Spring Session 使得支持群集会话变得微不足道,而不依赖于 application 容器特定的解决方案。
- RESTful API - Spring Session 允许在 headers 中提供 session ID 以使用RESTful API
5.2 与 Redis 的 HttpSession
通过在使用
HttpSession
的任何内容之前添加 Servlet 过滤器来启用 Spring Session 和HttpSession
。您可以选择使用以下任一方式启用此功能
- 基于 Java 的 Configuration
- 基于 XML 的 Configuration
5.2.1 Redis 基于 Java 的 Configuration
本节介绍如何使用 Redis 使用基于 Java 的 configuration 来支持
HttpSession
。HttpSession Sample提供了一个关于如何使用 Java configuration 集成 Spring Session 和
HttpSession
的工作 sample。您可以在下面阅读 integration 的基本步骤,但是在与您自己的 application 集成时,我们鼓励您遵循详细的 HttpSession 指南。Spring Java Configuration
添加所需的依赖项后,我们可以创建 Spring configuration。 Spring configuration 负责 creating Servlet 过滤器,该过滤器用 Spring Session 支持的 implementation 替换
HttpSession
implementation。添加以下 Spring Configuration:@EnableRedisHttpSession public class Config { @Bean public LettuceConnectionFactory connectionFactory() { return new LettuceConnectionFactory(); } }
@EnableRedisHttpSession
annotation 创建一个 Spring Bean,其 name 为springSessionRepositoryFilter
,用于实现 Filter。过滤器负责替换 Spring Session 支持的HttpSession
implementation。在这个例子中,Spring Session 由 Redis 支持。我们创建一个将 Spring Session 连接到 Redis 服务器的
RedisConnectionFactory
。我们将连接配置为在默认 port 上连接到 localhost(6379)有关配置 Spring Data Redis 的更多信息,请参阅reference 文档。Java Servlet 容器初始化
我们的Spring Configuration创建了一个名为
springSessionRepositoryFilter
的 Spring Bean,它实现了Filter
。springSessionRepositoryFilter
bean 负责使用 Spring Session 支持的自定义 implementation 替换HttpSession
。在我们的
Filter
做魔法的 order 中,Spring 需要加载我们的Config
class。最后我们需要确保我们的 Servlet 容器(i.e .Tomcat)对每个请求使用springSessionRepositoryFilter
。幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer
的实用程序 class,这两个步骤都非常简单。你可以在下面找到一个 example:src/main/java/sample/Initializer.java.
public class Initializer extends AbstractHttpSessionApplicationInitializer { public Initializer() { super(Config.class); } }
我们的 class(初始化程序)的 name 无关紧要。重要的是我们扩展
AbstractHttpSessionApplicationInitializer
。第一个 step 是扩展
AbstractHttpSessionApplicationInitializer
。这确保 namespringSessionRepositoryFilter
的 Spring Bean 在每个请求中都注册了我们的 Servlet 容器。
AbstractHttpSessionApplicationInitializer
还提供了一种机制,可以轻松确保 Spring 加载Config
。
9.7.2 EnableRedisHttpSession
在 web 环境中,创建新
RedisOperationsSessionRepository
的最简单方法是使用@EnableRedisHttpSession
。可以在第 3 章,Samples 和 Guides(从这里开始)中找到完整的 example 用法。您可以使用以下属性来自定义 configuration:
- maxInactiveIntervalInSeconds - session 之前 time 的数量将以秒为单位
- redisNamespace - 允许为会话配置特定于 application 的命名空间。 Redis 密钥和 channel ID 将以
<redisNamespace>:
的前缀开头。- redisFlushMode - 允许指定何时将数据写入 Redis。默认值仅在
SessionRepository
上调用save
时。RedisFlushMode.IMMEDIATE
的值将尽快写入 Redis。自定义 RedisSerializer
您可以通过创建实现
RedisSerializer<Object>
的名为springSessionDefaultRedisSerializer
的 Bean 来自定义序列化。
视频中也是去官网中看的,可以学到很多东西
具体的代码如下:
/**
* @author WGR
* @create 2020/7/21 -- 10:51
*/
@Configuration
public class GulimallSessionConfig {
@Bean
public CookieSerializer cookieSerializer(){
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
cookieSerializer.setDomainName("gulimall.com");
cookieSerializer.setCookieName("GULISESSION");
return cookieSerializer;
}
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer(){
return new GenericFastJsonRedisSerializer();
}
}
/**
* 核心原理
* 1)@EnableRedisHttpSession导入RedisHttpSessionConfiguration配置
* 1 给容器中添加了一个组件
* SessonReppository >>> RedisOperationSessionRepository,redis操作session的增删改查
* 2 SessionRepositoryFilter >> Filter: session存储过滤器,每个请求过来都必须经过filter
* 1.创建的时候,就自动从容器中获取到了SessionRepository;
* 2.原始的request,response都被包装了。SessionRepositoryRequestWrapper,SessionRepositoryWrapper;
* 3.以后获取session。request.getSession();
* 4.wrapperRequest.getSession();===>SessionRepository中获取到的。
*/
@EnableRedisHttpSession
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallAuthServerApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallAuthServerApplication.class, args);
}
}
下面是课件的图片