处理多个标签

时间:2018-01-26 02:34:58

标签: javascript php session authentication

最近遇到了这个问题。方案是,假设我打开了两个标签(A和B),我使用标签A登录验证重定向到主页。然后选择了一个链接,而不仅仅是输入,我右键单击并选择"在新标签中打开链接" ,从而拥有标签B 。此时我开始导航30分钟一个警告弹出说我的#34;会话已经完成。请再次登录。"。我没有被重定向到登录页面,而是被重定向到主页。 (警报必须来自标签A)

如果我只处理一个标签,那么在警报之后我不会直接进入登录页面。

我有两组代码,一组处理实际的会话到期,另一组代码发出警报。

此代码用于警报:

function idleLogout() {
var t;
window.onload = resetTimer;
window.onmousemove = resetTimer;
window.onmousedown = resetTimer; 
window.onclick = resetTimer;     
window.onscroll = resetTimer;   
window.onkeypress = resetTimer;

function logout() {
    alert("Session has been finish. Please login again.");
    window.location.href = '{{url("")}}';
}

function resetTimer() {
    clearTimeout(t);
    t = setTimeout(logout, {{ env('SESSION_LIFETIME')*60*1000 }} );  
}
}
idleLogout();

代码按预期工作,但可以更好地实施。

顺便说一句,如果使用PHP Laravel 5很重要

1 个答案:

答案 0 :(得分:1)

问题是您正在使用 JavaScript 来处理超时。 JavaScript(默认情况下)仅限于单个选项卡。虽然您在JavaScript中可以 make use of COOKIES 来在标签之间进行通信,但通过服务器端SESSION变量处理会话超时会更有意义,它贯穿标签。

在PHP中可以实现30分钟的强制超时,由this answer提供:

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

希望这有帮助。