官方文档: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放入容器中就能定制我们想要的功能的原理
此次分析或有不足之处,望大牛不吝赐教。