我正在尝试使“某物”知道用户是否正在关闭浏览器或在其他情况下处于空闲状态。我需要使用令牌注销用户。
我正在使用Symfony2.4,实际注销包括一个处理程序,因为我需要知道此人是否已登录另一台计算机。我不能简单地使用会话过期,因为该处理程序将不会执行,并且应用程序仍将用户显示为已登录。
我正在使用此代码,效果非常好!
<script>
var unloaded = false;
$(window).on('beforeunload', unload);
$(window).on('unload', unload);
function unload(){
if(!unloaded){
$('body').css('cursor','wait');
$.ajax({
type: 'get',
async: false,
url: "{{ logout_url('main') }}",
success:function(){
unloaded = true;
$('body').css('cursor','default');
},
timeout: 50
});
}
}
</script>
与此相关的是,当用户尝试访问网站中的任何链接时,此代码将执行,并且他们需要再次登录。
我可以做些什么来避免仅通过转到另一个链接就可以运行此代码,或者可以做些其他事情来获得相似的结果?
答案 0 :(得分:0)
这更多是Javascript问题,但是很好。
如何用javascript封装所有外部链接来设置禁止您的unload()
函数的标志?不过,这样做不是很明智,但应该可以。
类似的东西(未经测试):
$('a').click(function(){
// set the flag
myFlag = true;
return true;
}):
并在您卸载时:
function unload(){
if (myFlag) {
myFlag = false
return
}
// the rest here
}
编辑:
如果要发送有关页面卸载的请求,最好使用navigator.sendBeacon(),因为当用户代理有机会这样做时,数据会异步传输到Web服务器,而不会延迟卸载或影响下一次导航的性能。参见https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon