最近遇到了这个问题。方案是,假设我打开了两个标签(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很重要
答案 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
希望这有帮助。