Redis实现单点登录的原理

480 阅读3分钟

Cookie和Session实现登录的思路

1.我们在学习JavaWeb的初期时,无论是看视频还是看文章,大部分都会给我们讲解Cookie+Session实现登录,我在这里就不解释Cookie和Session是什么东西,我们直接进入到Cookie+Session是怎么实现登录的

Cookie+Session实现登录的场景: 在我们开发单体项目的时候


实现思路

  1. 前端访问了需要认证才能访问的权限
  2. 拦截器判断Session中是否含有对应的用户数据,没有则跳转到登录页面,有就放行
  3. 用户输入用户名和密码进行登录验证
  4. 查询数据库判断用户是否存在,没有则发送提示信息,提示用户去注册
  5. 查询到的用户数据存到Session中
  6. 下次拦截的时候,Tomcat会根据Cookie中的SessionID去服务器获取到对应的Session


思路图

image.png




Redis代替Session做登录

为什么要用Redis代替Session

  随着业务的不断扩展,单体项目已经无法满足我们,我们逐步将单体项目扩大为分布式的项目,这样会出现一个问题,也就是在不同的服务器上面存储的Session是不一样的,这样拦截器验证的结果就会不一样,而我们面对的这个问题,一般有以下的解决方案


常用的方式

  1. Session的复制(现在已不适用,因为会导致数据冗余)
  2. Cookie+Redis
  3. Token

  我们这里主要介绍的Cookie+Reids的模式,这里为什么使用Redis,以及除了Redis还有没有其它的方式,肯定是有的,但是我们不多做介绍


Redis+Cookie实现登录的思路

  1. 前端访问了需要认证才能访问的权限
  2. 拦截器查询ThreadLocal中是否含有用户的数据,有就放行,没有就是进行下一步
  3. 拦截器获取到Cookie(Header)中保存的用户的Id
  4. 根据Id拼接出来的Key去Redis中查找到到用户的数据,如果无,则跳转到用户登录页面,有就获取到用户的数据,保存到当前的ThreadLocal中,放行
  5. 没有跳转到用户的登陆页面
  6. 根据用户传递过来的表单数据查询数据库
  7. 数据库中有,就将用户数据格式化后存入到redis中,并且设置过期的时间(模仿Session的默认30分钟失效)
  8. 数据库没有,就将提示用户需要注册

思路图

image.png


  由于redis可以是在主服务器之外的服务器,所以它不会出现一个服务器中有,一个服务器中无用户数据的情况,我们可以通过搭建Redis的主从集群来增强系统的高可用性


  最后,这是我第一次写博客,希望大家可以指出我的博文中的错误,谢谢