BackGround 我制作了一个Webapp,用户需要登录才能使用该Webapp中的功能。
我想在Session方面使其相当安全(以避免将Session打开)。我知道在关闭浏览器时(默认情况下,关闭所有Chrome标签),会话会被破坏。我还在注销按钮上添加了此PHP代码以销毁它。
<?php
session_start();
unset($_SESSION['username']);
unset($_SESSION['password']);
session_destroy();
header('location: somelocation');
?>
我的问题是,当用户仅关闭应用程序所在的浏览器选项卡时,会话不会被破坏,并且无需重新登录即可重新打开会话。因此,如果用户打开了YouTube(例如)标签,而他仅关闭了我的应用所在的标签,则会话不会被破坏。有一种方法可以检测到它并破坏会话? 我已经看过了: logout user when browser or tab is closed和destroy session when broswer tab closed但是他们没有回答我的问题。感谢您的建议。
答案 0 :(得分:3)
我建议您应该对PHP函数进行AJAX调用,这将破坏会话。您在问题中编写的代码将起作用。但是有一个技巧可以发起AJAX调用。
当用户关闭浏览器选项卡时,将启动ajax并破坏会话。在这里,我展示了如何:
var flag_var = false;
function pageCleanup()
{
if (!flag_var)
{
$.ajax({
type: 'GET',
async: false,
url: 'SomeUrl.com/php_file.php',
success: function ()
{
flag_var = true;
}
});
}
}
$(window).on('beforeunload unload', function ()
{
//this will work only for Chrome
pageCleanup();
});
答案 1 :(得分:1)
由于客户端/服务器模型的性质,没有简单的方法可以执行所需的操作。如果用户在加载页面后可能会闲置一会儿,那么他也可以关闭标签并再次打开它。您无法控制客户端在客户端执行的操作。有简单的javascript方法可以做到这一点,例如unload event,但它们不可靠,而且通常不起作用。
您可以使用websockets来确保客户端始终处于连接状态或在后台执行多个ajax请求,并使会话中的超时保持几秒钟,但是如果用户的Internet连接断开,这些方法将断开用户的连接甚至一会儿。
答案 2 :(得分:0)
尽管用户仍在会话中处于活动状态,但会话超时存在细微差别。该问题与从不修改会话变量有关。
GC将根据其上次修改时间清除会话数据文件。因此,如果您从不修改会话,只需从中读取即可,GC最终将清除。
为防止这种情况,您需要确保在GC删除时间内修改了会话。您可以按以下方式完成此操作。
<?php
if( !isset($_SESSION['last_access']) || (time() - $_SESSION['last_access']) > 60 )
$_SESSION['last_access'] = time();
?>
这将每60秒更新一次会话,以确保修改日期被更改。