谷粒商城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,它实现了FilterspringSessionRepositoryFilter 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。这确保 name springSessionRepositoryFilter的 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);
    }

}

下面是课件的图片

image-20200721153622881

image-20200721153637513

image-20200721153650189

image-20200721153704548

image-20200721153713890

image-20200721153726586

image-20200721153750251

image-20200721153803893

posted @ 2020-07-21 15:42  天宇轩-王  阅读(466)  评论(9编辑  收藏  举报