官方文档:https://docs.spring.io/spring-session/docs/2.2.6.RELEASE/reference/html5/#api-cookieserializer

引入SpringSession依赖
<!--        SpringSession,解决分布式session共享问题-->
			<dependency>
			     <groupId>org.springframework.session</groupId>
			     <artifactId>spring-session-data-redis</artifactId>
			</dependency>
引入Redis依赖
<!--        redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
配置application.yml
spring:
  ## 配置SpringSession保存在redis中
  session:
    store-type: redis
  ## 配置redis
  redis:
    host: 192.168.30.130
    port: 6379
启用SpringSession
@EnableRedisHttpSession
public class ProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class, args);
    }
}
自定义CookieSerializer,解决子域session共享问题
@Configuration
public class MySpringSessionConfig {

    /**
     * cookie序列化器
     * @return
     */
    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("GULISESSION");
        serializer.setCookiePath("/");
        // 设置cookie的作用域为父域名
        serializer.setDomainName("gulimall.com");
        return serializer;
    }
}
自定义RedisSerializer,是为了能够在Redis Desktop Manager中方便查看session数据,将session数据序列化为JSON格式
@Configuration
public class MySpringSessionConfig {

    /**
     * cookie序列化器
     * @return
     */
    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("GULISESSION");
        serializer.setCookiePath("/");
        serializer.setDomainName("gulimall.com");
        return serializer;
    }

    /**
     * redis序列化器
     * @return
     */
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer(){
        return new GenericFastJsonRedisSerializer();
    }
}

注意:RedisSerializer的name要命名为"springSessionDefaultRedisSerializer",否则这个redis序列器是不生效的。

到这里SpringBoot整合SpringSession的配置就结束了,想要了解更多内容请查看官网文档

关于以上配置的部分说明

@EnableRedisHttpSession: 启用SpringSession

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(RedisHttpSessionConfiguration.class)
@Configuration
public @interface EnableRedisHttpSession {
	.......
}

@Import(RedisHttpSessionConfiguration.class) 导入RedisHttpSessionConfiguration配置

RedisHttpSessionConfiguration 中有这么一个方法,标注了@Qualifier(“springSessionDefaultRedisSerializer”),这就是为什么RedisSerializer的name要命名为"springSessionDefaultRedisSerializer"的原因

了解@Autowired(required = false)在方法上的作用

	@Autowired(required = false)
	@Qualifier("springSessionDefaultRedisSerializer")
	public void setDefaultRedisSerializer(
			RedisSerializer<Object> defaultRedisSerializer) {
		this.defaultRedisSerializer = defaultRedisSerializer;
	}

RedisHttpSessionConfiguration的父类SpringHttpSessionConfiguration中有下面的方法

	@Autowired(required = false)
	public void setCookieSerializer(CookieSerializer cookieSerializer) {
		this.cookieSerializer = cookieSerializer;
	}

这就是我们将CookieSerializer、RedisSerializer放入容器中就能定制我们想要的功能的原理

此次分析或有不足之处,望大牛不吝赐教。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐