【问题标题】:Dealing with session along multiple tabs沿着多个选项卡处理会话
【发布时间】:2018-07-05 10:04:16
【问题描述】:

最近遇到了这个问题。场景是,假设我打开了两个选项卡(A 和 B),我使用 Tab A 登录验证重定向到主页。然后选择一个链接而不是直接输入,我右键单击并选择“在新选项卡中打开链接”,从而拥有 Tab B。此时我开始导航 30 分钟会弹出一个警报,提示我“会话已完成。请重新登录。”。我没有被重定向到登录页面,而是被重定向到主页。 (必须为 Tab 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 很重要

【问题讨论】:

  • 不同窗口(选项卡)之间通信的几种方式是 postMessage API 和存储事件

标签: javascript php session authentication


【解决方案1】:

问题在于您使用 JavaScript 来处理超时。 JavaScript(默认情况下)仅限于单个选项卡。虽然您可以 make use of COOKIES在 JavaScript 中在选项卡之间进行通信,但通过服务器端 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

希望这会有所帮助。

【讨论】:

  • 您将遇到的问题是调用会话开始将重新更新会话时间,除非您单独跟踪时间,这就是这样做的。但这变得很麻烦。第一步是将会话存储在数据库中,然后您可以在会话之外访问数据库并使用会话时间本身,只需通过 ajax 传回用户 ID。但这样做并非易事。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2017-04-22
相关资源
最近更新 更多