我正在为一家研究公司开发一个 Web 应用程序,其中一个要求是用户一次只能在一台设备上登录。
所以我开发了一个非常基本的系统,当你登录一些 PHP 时,将数据库中的用户行从 0 更新为 1,当你单击注销按钮时,它再次将该行从 1 更新为 0。
唯一的问题是,如果用户不使用注销按钮而只是关闭浏览器,它将结束会话并将它们注销,但它们在数据库中的行不会被更新。
有没有办法在浏览器关闭时更新数据库?
您可以使用 unload 事件向服务器发送 ajax 请求,该请求将更新 mysql 中的标志。您可以尝试以下 jquery 语法。
$(window).bind('unload', function(){
$.ajax({
type: 'get',
async: false,
url: 'path/to/file.php'
});
});
没有可靠的方法。您可以在页面关闭时调用 javascript 函数,该函数又会向您的服务器发出请求,告诉它会话已完成,但同样:javascript 可能已关闭,甚至可能根本不执行。最好的办法是使用超时:存储最后一次操作的时间。如果超过 10 分钟前,“过期”会话。
这是浏览器关闭事件的简单解决方案。我遇到了“onunload”和“beforeonunload”事件的一些问题。它将在浏览器关闭、标签关闭、任何链接点击、URL 更改时触发。所以我像这样定制了我的代码。
<script type="text/javascript">
jQuery(document).ready(function() {
var validNavigation = false;
// Attach the event keypress to exclude the F5 refresh
$(document).bind('keypress', function(e) {
if (e.keyCode == 116){
validNavigation = true;
}
});
// Attach the event click for all links in the page
$("a").bind("click", function() {
validNavigation = true;
});
// Attach the event submit for all forms in the page
$("form").bind("submit", function() {
validNavigation = true;
});
// Attach the event click for all inputs in the page
$("input[type=submit]").bind("click", function() {
validNavigation = true;
});
window.onbeforeunload = function() {
if (!validNavigation) {
var status = 'abandoned';
$.ajax({
type: "POST",
url: your action URL,
data: "status=" + status,
success: function(res) {
},
});
}
};
});
</script>