在分布式开发时,不同的模块往往有不同的域名,而在当前域名下的session作用域局限于此域名,无法辐射到其他域名,即无法跨域产生作用。此时需要通过放大session的作用域来解决session共享问题。
第一步:pom文件中引入redis相关依赖(需要将session存入redis中)
org.springframework.boot spring-boot-starter-data-redisorg.springframework.session spring-session-data-redis
第二步:新建一个配置类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
第三步:在启动类上添加@EnableRedisHttpSession注解
@EnableRedisHttpSession
@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GulimallSearchApplication {
public static void main(String[] args) {
SpringApplication.run(GulimallSearchApplication.class, args);
}
}
第四步:在登录成功的逻辑中放入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的域名中,在其他分布式服务里面也能访问到其中的信息。



