JavaScript 实现前端登录超时提示重新登录

后台没有提供查询Session的接口,所以,用户登录成功后通过ajax查询session是否过期来决定用户长时间无操作后提示重新登录的方法不可行,故只能在前端用js去做个假的监听。

准备:经过一番百度等了解dom常用的事件,js的计时器基本使用, LayUI.layer的基本使用

/**
 * 全局监听用户操作,一段时间内无任何点击等操作将提示退出登录,清空缓存
 * 监听页面的点击、输入等事件,并重置起始时间
 * 登录成功后进行计时,初始化起始时间
 * 判断cookie是否存在
 * 清除cookie,弹窗提示,默认点击即退回登录页,清除浏览器前进后退历史
 * 前后间隔时间 单位毫秒
 */
var oldTime;
var newTime;
var outTime = 15 * 60 * 1000; //设置超时时间:15 分钟
// var outTime = 5 * 1000; //设置超时时间(秒)
// 计时器常量
var timer;

function validTimeOut(){
	newTime = new Date().getTime(); //更新未进行操作的当前时间
	if(newTime - oldTime >= outTime){ //判断是否超时再进行操作
		console.log("时间到,退出登录");
		stopTimer();
		popUpTimeOut();
	}
};

/**
 * 超时弹出对话框
 */
function popUpTimeOut(){
	// 弹出时停止定时器
    if(!timer){
        return;
    }

	stopTimer();
	layer.confirm("因长时间待机未进行操作,点击确定重新登录",{
		btn:['确定'],
		title: "登录超时",
		yes: function(index, layero){
			onTimeOutLogOut();
			window.open('../../login.html','_self');
		},
		cancel: function(){
			onTimeOutLogOut();
			window.open('../../login.html','_self');
		}
	});
};

/**
 * 开始计时
 * 计时器,每2秒走一次outTime
 */
function startTimer() {
	if (window.top != window.self){
		;
	}else {
		if (!timer) {
			timer = window.setInterval(validTimeOut, 3000);
		}else {
			oldTime = new Date().getTime();
		}

		document.onclick = eventListen;
		document.onmousemove = eventListen;
		document.ondblclick = eventListen;
		document.onkeydown = eventListen;
		document.onwheel = eventListen;
	}
};

/**
 * 停止计时
 */
function stopTimer() {
	clearInterval(timer);
	// newTime = new Date().getTime();
};

/**
 * 超时退出登录
 */
function onTimeOutLogOut(){
	var surl=remote_service+"/login/logout?r="+Math.random();
	var obj = {url:surl,data:null,type:'get'};
	project.myAjax(obj,function(data){
		if (data.code=="1000")
		{
			onLogOutRemoveCookie();
		}else{
			;
		}
	});
};

/**
 * 监听事件
 */
function eventListen(){
	if (!timer) {
		return;
	}
	oldTime = new Date().getTime();
};

/**
 * 退出登录时清除cookie
 */
function onLogOutRemoveCookie(){
	// 清除
	// $.cookie("userToken",null)
	// document.cookie = "userToken=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
};

/**
 * 所有引用该js的页面载入自动执行
 */
$(function () {
	if (window.top.location.pathname != "/"){
		startTimer();
	}
});

清除cookie的方法没有实现,后来一想没有必要做这个了。在validTimeOut() 方法内可以加个log,每2秒就会在console打印一个毫秒数。该方案只为应付需求,不需要和后台打交道。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个比较常见的前端开发任务,下面给出一个简单的实现方案。 首先,需要在 HTML 文件中创建一个表单,包含用户名和密码两个输入框,以及一个提交按钮。代码如下: ```html <form> <div> <label for="username">用户名:</label> <input type="text" id="username" name="username"> </div> <div> <label for="password">密码:</label> <input type="password" id="password" name="password"> </div> <button type="submit">登录</button> </form> ``` 接着,在 JavaScript 文件中添加表单提交事件的监听器,代码如下: ```javascript document.querySelector('form').addEventListener('submit', function(event) { // 阻止表单默认的提交行为 event.preventDefault(); // 获取表单中的用户名和密码输入框 var usernameInput = document.querySelector('#username'); var passwordInput = document.querySelector('#password'); // 获取输入框中的值 var username = usernameInput.value; var password = passwordInput.value; // 对用户名和密码进行合法性校验 if (username.trim() === '') { alert('用户名不能为空'); usernameInput.focus(); return; } if (password.trim() === '') { alert('密码不能为空'); passwordInput.focus(); return; } // 如果校验通过,则提交表单 this.submit(); }); ``` 在事件监听器中,首先阻止表单默认的提交行为,然后获取用户名和密码输入框的值,对其进行合法性校验。如果输入框中的值为空,则弹出提示框并将焦点设置到对应的输入框中,返回即可。如果校验通过,则调用表单的 submit 方法提交表单。 最后,需要注意一点,即在服务器端也需要对用户输入进行校验,前端只是起到了一个辅助的作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值