先简单说一下单点登录:
把登录的部分单独拿出来作为一个项目,专门用来登录。
当我想访问某个子项目或者模块的时候,会先请求登录的部分,如果登录过了,就不需要再登录了。
这个和单独项目时,把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中放第二条,就无法实现单点登录同步登出,虽然设置了过期时间,但用户体验和安全性还是差一点。