这几天上级让我做超时登陆验证,当时一听感觉很简单啊,用session,然后再改改配置文件不就是可以了吗,后来在网上看了看才知道这个配置文件不可以乱改,会影响程序运行的效率,接着我就只好试试别的办法了。
起初我采用的是js判断,使用定时器,鼠标移动和点击都会触发事件,然后问题来了,由于页面上有弹出层,弹出之后上一层的计时器依旧运行,虽然可以使用clearInterval可以清除,但是需要考虑的问题甚多,最后我是被焦点的问题给劝退了,如果有想看js写的可以私聊我。
于是我开始考虑第二种方法,我分析了一下网站的结构,所有的行为都继承自一个共有的 类,登陆的session等信息都存在此处,那么,也就是说每次有行为都会经过该类的构造方法,我们可以通过该方法存入两个session,第一个是行为时间session(“timer”,time()),时间取当前时间,之后在定义一个过期时间session(“sleep”,time()+3600),这样第一步算是完成了,行了,上代码

<?php
//框架tp5 只要是MVC模式的按照这种逻辑都一样
namespace app\\index\\controller;
use think\\Controller;
class   extends Controller
{
	public function __construct(){
		parent::__construct();
		$this->_user = session(\'user\');
		if(!$this->_user){
			echo \"< >\";
			echo \"top.location.href=\'/index.php/index/account/login\'\";
			echo \"</ >\";
		} else {
			session(\"timer\",time());
			//一小时无操作自动退出
			session(\"sleep\",time()+3600);
		}
	}
}

第二步,在前端页面采用ajax,每秒获取一次当前时间,在和过期时间做差,因此ajax访问的类一定不可以继承自 ,我是建立了一个pub类,里面写入了一个isSleep方法,该方法用于判断和更新当前时间。

<?php
namespace app\\index\\controller;
use think\\Controller;

class Pub extends Controller{
	public function isSleep(){
		//更新当前时间
		session(\"timer\",time());
		//获取当前时间
		$last = session(\"timer\");
		//获取退出时间
		$max = session(\"sleep\");

		if($max - $last <= 0){
			exit(json_encode(array(\'timeout\'=>\"true\")));
		} else {
			exit(json_encode(array(\'timeout\'=>\"false\")));
		}
	}
}

然后就是前端ajax了,这个就简单多了,只要是导入了jquery就能使用了,我用的是jquery+ , 是用于美化提示框的,可以无视

<  src=\"/js/jquery-1.8.2.min.js\"></ >
<input type=\'hidden\' id=\"timer_sleep\" value=\"false\">
< >
	setInterval(function(){
		//自动退出时间
		var sleep;
		//获取
		var url = \"/index.php/index/pub/isSleep\";
		$.get(url,function(e){
			$(\"#timer_sleep\").val(\'\');
			$(\"#timer_sleep\").val(e.timeout);

		},\"json\")
		sleep = $(\"#timer_sleep\").val();
		//console.log(sleep);
		if(sleep == \"true\") {
			 .alert(\"登陆超时\",{\'icon\':2});
			setTimeout(function(){
				window.top.location.href = \"/index.php/index/account/login\";
			},800)
		}
	},1000);
</ >

希望能对大家有所帮助吧。

收藏 打印