0
点赞
收藏
分享

微信扫一扫

分布式下session共享,redis存储session

在分布式开发时,不同的模块往往有不同的域名,而在当前域名下的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);
    }
}

第四步:在登录成功的逻辑中放入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的域名中,在其他分布式服务里面也能访问到其中的信息。

 

举报

相关推荐

0 条评论