在用户表增加两个字段,
- is_login 记录登录状态,(0未登录,1已登录)
- session_id 记录登录的session_id
控制器操作:
- 正常退出: 更新 is_login为0
- 非正常退出: 判断is_login, 若为
- 0 则直接登录
- 为1 且最近登录时间小于30分钟
- 提示”该用户已经登录”,给出以下选项
- 不登录返回首页
- 短信验证->注销该用户所有SESSION->正常登录,
- 为1 且最近登录时间大于30分钟
- 正常登录,(更新session_id ,is_login =1)
原理图
如果用户退出后修改is_login的状态,但是问题的难点是用户进行非法退出,就无法修改is_login的状态,需要进行再一步的判断,即如果is_login为1的话不能直接提示“已经登录”,而是需要判断旧的session_id对应的session在服务器中是否存在,存在的话就提示“已经登录”,不存在就允许登录.
前端登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>单用户登录</title>
</head>
<body>
<input type="text" id="user" value="admin">
<input type="text" id="pwd" value="password">
<button id='save'> Click Me</button>
<script src="./jquery.js"></script>
<script>
$(document).ready(function(){
$('#save').click(function(){
$.ajax({
type:"POST",
url:"./login.php",
data:{"user":$("#user").val(),"pwd":$("#pwd").val()},
dataType:"json",
success:function(data){
if(data.success){
alert(data.msg);
}else{
alert(data.msg);
}
},
error:function(jqXHR){
alert('Error code'+jqXHR.status +'message:'+jqXHR.responseText);
}
});
});
});
</script>
</body>
</html>
后台登陆页面
header("Content-type:text/html;charset=utf-8");
ini_set('display_errors',);
ini_set('display_startup_errors', );
error_reporting(E_ALL);
$user = "admin";
$pwd = "password";
//echo '{"success":false,"msg":'.json_encode($_POST).'}';
//echo '{"success":true,"msg":"Login success!"}';
//return;
# 简单进行账号密码判断
# 请根据现有框架进行数据处理和安全校验.这里略过
if($_POST['user'] == $user && $_POST['pwd']== $pwd){
# 跳过
}else{
echo '{"success":false,"msg":"账号密码错误"}';
return;
}
/*
* 正常登录操作
*/
function login(){
// 执行正常登录操作和过滤操作
$is_login = ;
$_SESSION['session_id'] = base64_encode(time() + );
}
$is_login = ;
session_start();
# 没登录过则更新session_id和登录状态is_login;
if($is_login == ){
login();
}
# 上次有登录,没有正常登出操作
if($is_login == ){
# 如果存在session,但是时间超时,则跳转登录
if( isset( $_SESSION['session_id']) ){
$str = $_SESSION['session_id'];
if (time() < base64_decode($str)){
echo '{"success":true,"msg":"已有在线用户登录"}';
return;
}else{
# 距上次登录大于20分钟则直接登录
login();
}
}
}
echo '{"success":true,"msg":"登录成功!且SESSION已设置为:'.$_SESSION["session_id"].'"}';
return;