这里,我们选用spring session 的redis存储模式来解决分布式session的问题
一、整合与使用
1.引入依赖(注:前提是你的项目中要有 redis 依赖哦!)
<!-- 整合springsession -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2.启动类中开启 springsession
@EnableRedisHttpSession //开启springsession
3.在配置文件中指定springsession存储介质为redis
spring.session.store-type=redis
4.想要在多个子域名中都可以使用json的形式存储session,我们还需要对作用域和序列化方式进行配置
package com.xxx.xxx.product.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.web.http.CookieSerializer;
import org.springframework.session.web.http.DefaultCookieSerializer;
@Configuration
public class MySessionConfig {
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
cookieSerializer.setDomainName("xxx.com");
cookieSerializer.setCookieName("XXSESSION");
return cookieSerializer;
}
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}
这里进行一下说明,我们的session在客户端记录成cookie时是有作用域的,比如你在 ss.xxx.com 生成的cookie ,里面存储的作用域就是 ss.xxx.com ,所以我们需要扩大他的作用域 为 ”.xxx.com“ 后,才能使各个子域名下的微服务进行session互通 如百度的:
5 . 正常使用session即可(示例)
String userInfo= new UserInfo();
String userInfoString = JSONObject.toJSONString(userInfo);
session.setAttribute("userInfo", userInfoString);
String userInfoSessionStr = session.getAttribute("userInfo");
二、核心原理
|