分布式下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);
    }
}

第四步:在配置文件中配置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")); 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值