使用Redis实现分布式会话

1. 概述

传统的单体应用中,用户是否登录,通常是通过从Tomcat容器的session中获取登录用户信息判断的。

但在分布式的应用中,通常负载均衡了多台Tomcat,每台Tomcat都有自己独立的session,用户的每次请求都可能到达不同的Tomcat,因此可能会出现需要登录多次或者登录无效的情况出现。

为了解决这个问题,就需要使用一个缓存中间件,将登录用户的信息存入这个缓存中间件,所有的Tomcat都从缓存中间件中获取登录用户信息,从而判断登录状态。

Redis就是一个很好用的缓存中间件,接下来我们就来聊聊分布式应用该如何实现用户登录的逻辑。

2. 单体应用的用户登录

传统的单体应用,通常只有一个Tomcat。

用户提交登录信息时,后台会根据用户登录名,得到用户信息,然后比对密码,如果正确,则将用户信息放入Tomcat的session中。

用户请求需要登录的接口时,先从Tomcat的session中得到用户信息,如果用户信息是null,则接口无法访问,提示用户登录。如果用户信息不为null,则使用用户信息完成接口逻辑。

3.分布式应用的用户登录

3.1 方案一:允许用户异地登录

用户提交登录信息时,后台根据用户登录名,得到用户信息,然后比对密码,如果正确,则生成一个随机数。

以这个随机数为key,用户信息为value,存入redis。

在cookie中存入一个固定值的key,例如:mySessionId,value为这个随机数。

用户请求需要登录的接口时,先从cookie中拿到随机数,然后以随机数为key,从redis中得到用户信息,如果用户信息不为null,则表示用户已登录。

用户注销登录时,将cookie中的随机数和redis中的用户信息都清空。

3.2 方案二:不允许用户异地登录(以新登录的为准)

用户提交登录信息时,后台根据用户登录名,得到用户信息,然后比对密码,如果正确,则生成一个随机数。

将这个随机数放入用户信息中,在cookie中存入一个固定值的key,例如:curUser,value是脱敏后的用户信息。

以用户ID为key,这个随机数为value,存入redis。

用户请求需要登录的接口时,先从cookie中拿到用户信息,然后以用户信息中的用户ID为key,从redis中得到随机数。

如果redis中随机数不存在,则表示没有登录,如果存在,使用redis中得到的随机数与cookie中用户信息中的随机数做对比,如果不一致,则表示用户在其他地方登录,需要重新登录。

用户注销登录时,将cookie中的用户信息和redis中的随机数都清空。

4.综述

今天简单聊了一下使用redis实现分布式会话,希望能对大家的工作有所帮助。

欢迎大家多多评论交流,共同成长。

关注追风人聊Java,每天更新Java干货。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追风人聊Java

您的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值