项目场景:

页面长时间未操作的时候,会自动退出登录,并且提示你的登录已过期,需重新登录。那这个是怎么实现的呢?


两种方案

第一种是完全由后端实现的,后台在servlet可以获取到session,可以设置一个十分钟(这个时间根据你的需求而定)的过期时间,过期sessionId会重新生成,后端直接判断当前sessionId是否更改,判断完后直接重定向到登录页面。

第二种是由前端和后端配合实现的,当我们登录系统时,在登陆后,后台会种一个指定时长的登录态到cookie;前端的原理很简单,就是轮询登录态,发现登录态过期了,就弹框提示
代码如下:

	// 1.获取本地登录态;
	let userCookie = $.cookie( 'appid ');
	// 2.轮询登录态
	let timerId = setInterval(()={
	// 判断当前获取的登录态和之前获取的登录态是否一致
	if($.cookie( 'appid') != usercookie){
		// 不一致时,估计是不同用户登录
		// 继续判断当前登录态是否过期	
		if(typeof $.cookie( 'appid') == undefined && typeof userCookie != undefined)E
			// 登录态过期则弹窗提示
			alert("您的登录已过期请重新登录");
		}
	}},1000)


关于它的Tips:

登录态:在服务端一般会使用session或者token来表示用户的登录状态,用来标识这个用户的身份。

登录成功后,后端会给session设置一个字段,给字段设置对应的值,过期失效后这个值就会变成空或者undefined之类的。

登录态的解析一般就是入参是token,而返回结果是userId的方法(或服务、接口),第一次登录成功时,后端会把用户信息加密生成一个token,通过登录接口返回给前端 ;解析登录态时,前端通过发请求调接口的方法把token传到后台,由后端解析判断


登录态的几种类型:

1.存储型token
存储型token,就是根据token这个字符串,可以在服务端存储上查到用户信息,那就是校验成功,如果查不到,那就是校验失败。

2.计算型token
计算型token,就是把用户信息如userId加密成一个字符串,这个字符串就是token,那么每次解析其实就是解密,解密出明文,比如userId,generateTimestamp,那么再根据generateTimestamp判断是否过期,如果解析都失败了,那就直接失败。

3.计算存储
考虑到计算和存储的优劣势,我们可以考虑结合他们。这里举个例子token是个加密后的密文,解密后可以分成好几个字段,分别代表userId,generateTime,randomString。那么,如果解析都失败了,那就直接失败了,如果解析成功了,再根据generateTime来判断是否过期,如果过期了,那也直接失败了,如果都通过了,在拿randomString去存储中查询,以Redis为例,我们的存储结构可以设计成key是userId,value是sorted set,其中每个元素就是randomString,查得到就是合法,查不到就是非法。

来源:简书
作者:Christine的学习日记
链接:https://www.jianshu.com/p/7829f6ece110

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐