如何检测会话ID是死还是活? 让我们假设有人登录 - 创建了一个新会话并保存了会话ID。如果他从另一个浏览器登录,我可以确定他已登录两次。但如何检测他是否退出?
答案 0 :(得分:4)
您需要做的是当他在新浏览器上登录他的帐户时,找到与其帐户关联的旧会话ID并使其过期。当他点击退出按钮时,您可以退出该会话ID。
编辑:
抱歉,我读错了你的问题。您要做的是设置会话超时,以便在达到超时时,您认为会话已停止并使其过期。在每个页面请求中,您将更新到期日以使其生效。如果他们从另一个浏览器登录,您可以假设旧浏览器中的会话已经过时,并且会立即使其终止,或者让它在超时时间到期。
然后,您可以检查页面加载时的会话超时,或运行将通过会话数据库运行的cron脚本并使所有旧会话到期。
答案 1 :(得分:3)
当用户登录时,您应设置会话变量以表明他们已登录。
如果用户退出,您应使用session_destroy()
结束会话。
这样变量就被破坏了,所以如果检查会话变量就不会这样。我个人使用$_SESSION['isLoggedIn'] = TRUE
。
编辑添加:如果您希望在多个浏览器或计算机上使用此功能,则需要将登录或会话ID保存到数据库,以便检查用户是否在其他位置登录。
答案 2 :(得分:3)
一般来说,“登录”的操作通常链接到某种持久层,通常是数据库服务器中用户的表/集合。
在登录时使用此保存的数据创建会话,并将保存的数据以某种方式序列化到$_SESSION
超全局。
如果您想全局跟踪登录/注销,则需要保存一些用户ID(通常是电子邮件或某些登录凭据),这两个ID与两个单调递增的整数相关联,这两个整数表示他们已登录/退出的次数来自任何地方。
没有严格的规则,这必须在数据库中进行,它只是更好地扩展。对于小型或测试用例,您可以轻松保存分页文件。
主要思想是,要使任何类型的数据持续超过引用服务器上会话的session_id
cookie的到期时间,您需要实现某种形式的持久性。
答案 3 :(得分:3)
用户登录时使用$ _SESSION []并将变量设置为true。如果需要,您也可以在会话变量中保存一些数据。用户单击注销后,会话变量将设置为false。代码如下:
function Login()
{
if(!isset($_SESSION)){ session_start(); }
if(!$this->CheckLoginInDB($email,$password))
{
return false;
}
$_SESSION[$this->GetLoginSessionVar()] = $email;
return true;
}
function GetLoginSessionVar()
{
$retvar = md5($this->rand_key);
$retvar = 'usr_'.substr($retvar,0,10);
return $retvar;
}
function LogOut()
{
session_start();
$sessionvar = $this->GetLoginSessionVar();
$_SESSION[$sessionvar]=NULL;
unset($_SESSION[$sessionvar]);
}
这是一种简单的方法。如果你想要一个时间。您可以使用$ _SESSION []变量的开始时间,然后设置超时时间。检查任何活动,直到那时为止,然后退出:
function LogOut(){
session_start();
// set timeout period. This will be in seconds.
$inactive = 1000;
// check to see if $_SESSION['timeout'] is set
if(isset($_SESSION['timeout']) ) {
$session_life = time() - $_SESSION['start'];
if($session_life > $inactive)
{ session_destroy(); header("Location: logoutpage.php"); }
}
$_SESSION['timeout'] = time();
}
可能有更好的方法来做到这一点。我正在寻找一种更好的方法来自己做。希望能帮助到你。
因此,如果他关闭浏览器,他会在不活动后退出。但是,如果您想在浏览器关闭后退出,请检查ini.session.cookie-lifetime
答案 4 :(得分:2)
为此您需要登录您的用户表,或者切换到在DB中存储会话,然后您可以检查针对用户的会话(如果您以这种方式进行设置)。