当线上集群时候,会出现session共享问题 。
虽然Tomcat提供了session copy的功能,但是缺点比较明显:
1:当Tomcat多的时候,session需要大量同步到多台集群上,占用内网宽带
2:同一个用户session,需要在多个Tomcat中都存在,浪费内存空间 。
凯哥推荐:
redis快速入门
【图文教程】Redis分片集群搭建
【图文教程】Redis哨兵集群的搭建
【图文教程】Redis主从集群安装
【图文教程】centos单机安装Redis
Redis实战9-全局唯一ID
分库分表之后,ID主键如何处理?
如果要替换掉Tomcat的session共享,替代方案应该满足:
1:数据共享
2:内存存储
3:keyvalue结构
文章插图
基于Redis实现共享session登录
再来回顾下将验证码保存在session中业务流程
文章插图
我们在session中存放的是:session.setAttribute("code", code); 因为session的特点,每次访问都是一个新的sessionId.我们可以直接使用code作为key.思考:那么如果换成了Redis,还能使用code作为可以吗?
将用户信息存放在session中流程:
文章插图
用户信息在session中存放:session.setAttribute("user", user); 同样思考:那么如果换成了Redis,还能使用user作为可以吗?
将code和user信息存放在Redis中,流程如下
文章插图
验证码数据结构是:string类型的
用户对象数据类型是:hash类型的
根据上面分析,我们修改原来代码:
需要考虑的是:Redis的key规则、过期时间
1:发送验证码的时候,将验证码存放到Redis中时候,需要考虑过期时间 。其核心代码如下:
文章插图
stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY + phone, code, LOGIN_CODE_TTL, TimeUnit.MINUTES);
2:用户登录的时候,校验验证码及将用户存放返回token
需要考虑的:
1:token不能重复
2:用户过期时间
3:登录成功后,要将token返回给前端
4:用户只要访问,Redis中的过期时间就要延长-在拦截器中处理的
用户登录核心代码修改:
文章插图
//2.1:校验验证码是否正确
//String code = (String) session.getAttribute("code");
String code = stringRedisTemplate.opsForValue().get(LOGIN_CODE_KEY + phone);
if (StringUtils.isEmpty(code) || !code.equals(loginForm.getCode())) {
return Result.fail("验证码错误!");
//2.2:根据手机号查询,如果不存在,创建新用户
QueryWrApper queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "phone", "nick_name");
queryWrapper.eq("phone", phone);
User user = this.getOne(queryWrapper);
if (Objects.isNull(user)) {
log.info("新建用户");
//新建用户
user = createUserWithPhone(phone);
//2.3:保存用户到session中
UserDTO userDTO = new UserDTO();
userDTO.setId(user.getId());
userDTO.setIcon(user.getIcon());
userDTO.setNickName(user.getNickName());
//session.setAttribute("user", userDTO);
【Redis实战之session共享】//2.3.1:获取随机的token,作为用户登录的令牌
String token = UUID.randomUUID().toString(true);
//2.3.2:将用户以hash类型存放到Redis中==》将user对象转换成map
//user对象里有非string类型的字段,用这个方法会报错的
// Map userMap = BeanUtil.beanToMap(userDTO);
Map userMap = BeanUtil.beanToMap(userDTO,new HashMap<>()
推荐阅读
- 关之琳|钟镇涛70岁寿宴亮点多!关之琳紧挨前男友,叶童老公搂异性合影
- 贵池|12800余个岗位!2023春风行动之郑州名企专场招聘会等你来
- 凤凰为什么被称为百鸟之王 百鸟之王少昊读后感
- 耄耋之年指的是多少岁 耄耋之年的读音
- 雷佳音|《长安十二时辰2》将拍,雷佳音有望回归主演,疑似演绎安史之乱
- 张嘉倪|邵晴疑似回应插足张嘉倪买超婚姻,网友质疑为什么之前不出来澄清
- booking和携程哪个好,盘点两者之间的区别与差距
- 耳机排名前十的品牌有哪些,音质最好的耳机性价比之王推荐
- 小米画报有什么用小米画报关闭之后会有什么影响……小米画报有用吗?
- 香港电影|《华尔街之狼》的原型比电影还要疯狂?