在分布式开发时,不同的模块往往有不同的域名,而在当前域名下的session作用域局限于此域名,无法辐射到其他域名,即无法跨域产生作用。此时需要通过放大session的作用域来解决session共享问题。
第一步:pom文件中引入redis相关依赖(需要将session存入redis中)
<!--引入redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--登录session -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
第二步:新建一个配置类SessionConfig,用于规定共享session的名字和作用域
@Configuration
public class GulimallSessionConfig {
@Bean
public CookieSerializer cookieSerializer(){
DefaultCookieSerializer defaultCookieSerializer
= new DefaultCookieSerializer();
//设置session的作用域名,设置母域名,即可辐射到各个子域名
defaultCookieSerializer.setDomainName("gulimall.com");
//设置cookie的名称,这一步可有可无
defaultCookieSerializer.setCookieName("GULISESSION");
return defaultCookieSerializer;
}
//配置序列化规则,在redis中存入能让人看懂的数据,否则默认存16进制数据
@Bean
public RedisSerializer<Object> springSessionDefaultRedisSerializer(){
return new GenericJackson2JsonRedisSerializer();
}
}
第三步:在启动类上添加@EnableRedisHttpSession注解
@EnableRedisHttpSession
@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallSearchApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallSearchApplication.class, args);
}
}
第四步:在配置文件中配置redis相关配置
#让spring知道是什么类型的缓存,这里是redis
spring.session.store-type=redis
#配置redis的过期时间,默认是30分钟,若分布式事务未完成,会自动续期
server.servlet.session.timeout=30m
#redis的主机地址
spring.redis.host=192.168.88.110
#redis端口号
spring.redis.port=6379
第五步:在登录成功的逻辑中放入session
@PostMapping("/login")
public String login(UserLoginVo vo, RedirectAttributes redirectAttributes
, HttpSession session){
R login = memberFeignService.login(vo);
if(login.getCode()==0){
MemberRespVo data = login.getData();
//TODO 放入session中
session.setAttribute(AuthServerConstant.LOGIN_USER,data);
return "";
}else{}
}
完成以上步骤之后,当登录成功,spring就会将session放入 .gulimall.com的域名中,在其他分布式服务里面也能访问到其中的信息。
此时,如果前端需要获取session中的数据时,且使用的thymeleaf模板,则使用表达式获取值(记得引入命名空间)
<span class="x-red" th:text="${session.USER_INFO.uName}"/>
若前端使用的是vue,使用JSON.parse(sessionStorage.getItem("userInfo"))获取值
let myName=JSON.parse(sessionStorage.getItem("userInfo"));