页面长时间未操作,实现自动退出登录原理

项目场景:

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


两种方案

第一种是完全由后端实现的,后台在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

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现用户长时间操作退出登录的方法可以通过以下步骤来实现: 1. 获取用户的最后一次操作时间,可以通过记录用户最后一次操作时间戳或者会话的最后访问时间来实现。 2. 设置一个时间阈值,比如说30分钟,如果当前时间减去用户最后一次操作时间大于等于这个时间阈值,则认为用户长时间没有操作,需要退出登录。 3. 在用户每次操作时,更新用户的最后一次操作时间。 4. 可以使用定时器或者线程来实现定时检查用户的最后一次操作时间,如果超过时间阈值则强制退出登录。 下面是一个 Java 实现的示例代码: ```java import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class UserSession { private long lastAccessTime; private Timer timer; public UserSession() { lastAccessTime = new Date().getTime(); timer = new Timer(); timer.schedule(new TimeoutTask(), 30*60*1000); // 设置30分钟的超时时间 } public void access() { lastAccessTime = new Date().getTime(); } public void cancel() { timer.cancel(); } class TimeoutTask extends TimerTask { @Override public void run() { long currentTime = new Date().getTime(); if (currentTime - lastAccessTime >= 30*60*1000) { // 如果超时则退出登录 cancel(); // 执行退出登录操作 } } } } ``` 在每次用户访问时,调用 `access()` 方法更新最后一次访问时间,在用户退出登录时,调用 `cancel()` 方法取消定时器任务。当超时时,定时器任务会自动执行 `run()` 方法,检查最后一次访问时间是否超过指定的阈值,如果超过则执行退出登录操作

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值