最近遇到这个问题。场景是,假设我打开了两个选项卡(A 和 B),我使用 Tab A 登录验证重定向到主页。然后选择一个链接而不是直接输入,我右键单击并选择“在新选项卡中打开链接”,这样就有了选项卡 B。在这一点上,我开始导航 30 分钟 弹出一个警告说我的“ session 已完成。请重新登录。”。我没有被重定向到登录页面,而是被重定向到主页。 (警报必须出现在选项卡 A 上)
如果我只处理一个选项卡,这不是警报后的问题,我会直接转到登录页面。
我有两组代码,一组处理实际 session 过期,另一组发出警报。
此代码用于警报:
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 很重要
最佳答案
问题是您正在使用 JavaScript 来处理超时。 JavaScript(默认情况下)仅限于单个选项卡。虽然你可以 make use of COOKIES
在 JavaScript 中,为了在选项卡之间进行通信,通过服务器端 SESSION
变量处理 session 超时会更有意义,这些变量在选项卡之间持续存在。
可以在 PHP 中实现三十分钟的强制超时,由 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
希望这对您有所帮助。
关于javascript - 处理多个选项卡上的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48455029/