当分布式系统单个服务启动多次,会面临session不可用的情况,当然也有很多方法可以解决,比如采用nginx中的的ip_hash机制,比如将Session加密存在cookie中等等,此篇简单介绍Spring Cloud项目通过Redis共享session的配置,因为不是用来存储用户信息,只是临时保存一个正确验证码,所以没有考虑跨域的事情,如果需要单点登录的功能建议转战JWT
场景描述
用户发送短信之前需要输入正确的图形验证码才能发送短信。
实现思路
给前端返回验证码的图片流,将这个正确的验证码值存在session中,每次只要request获取session中塞入的正确验证码的值与用户输入的验证码做对比,判断是否通过,但是服务启动多次不可用
不使用session共享的解决方案
将”imgcode_”字段与客户端ip拼接作为key值,正确的验证码作为value值一起存入redis,加上半小时的过期时间
通过Redis共享Session
pom.xml
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
在子服务的springboot启动类上加上@EnableRedisHttpSession
实现session共享
@EnableRedisHttpSession
没有其他多余代码,Redis的基础配置不做赘述,重新启动项目会发现客户端不管访问哪一个服务都是同样的session,这样就可以往session塞入想要的值自由发挥了