关于redis实现单点登录的一点思路

先简单说一下单点登录

把登录的部分单独拿出来作为一个项目,专门用来登录。

当我想访问某个子项目或者模块的时候,会先请求登录的部分,如果登录过了,就不需要再登录了。

这个和单独项目时,把userId放到session中道理是一样的

因为多个子项目在不同的tomcat无法实现session共享,这时我们可以利用cookie


多说几句关于cookie和session的区别

cookie是针对于浏览器的,session是针对服务器的。

cookie的产生会有JSessionId,也就是session的唯一凭证。

cookie是当前浏览器对该父域名用作数据共享和记录的。

session是在服务器上开辟了一块内存,用于当前session(同一JSessionId)用户的数据共享。

关于cookie和session的区别只是个人理解,有不同的看法可以提,多交流。


说一下流程:

用户在一个模块登录,会进到登录系统,先验证你的用户名和密码是否正确,如果正确。

会产生一个唯一票据,我们这里叫他token,把这个token放到redis中,存放方式是这样的。

redis.put(token,userId);//存储一条对应用户信息的token

redis,put("your setting",token);//再存储一条对应userId的唯一标识,your setting可以写成loginSys+userId

为什么要这么存,正常的思路是只存上面一条就行了,稍后解答。


我们把token返回,response.addCookie(new Cookie("my cookie",token));//这里的my cookie可以写成loingSysCookie

流程实现是这样的,需要设置过期时间等等参数,这里就不写了。


这时候只要是同一浏览器,就会带着这个cookie,访问该项目下的子项目(父级域名下的子级域名,比如www.baidu.com和mp3.baidu.com的关系),

进入登录系统,拿到token,进到redis中比对,是否有用户就可以了,如果有,就不需要再登录了。

下面说一下上面的疑问:

当我再一次登录系统的时候,先去找redis中的redis,get("your setting")是否为空,已经在别处登录过的用户,可以取到他的token,

redis.del(token),这样就实现了单点登录,同步登出。

之后再设置redis和cookie,方法同上。


很多没有redis中放第二条,就无法实现单点登录同步登出,虽然设置了过期时间,但用户体验和安全性还是差一点。






猜你喜欢

转载自blog.csdn.net/angry_mills/article/details/73866332