空闲,注销和会话到期,如何使它与Symfony一起使用?

时间:2019-04-11 14:58:42

标签: javascript php symfony session-cookies logout

我正在尝试使“某物”知道用户是否正在关闭浏览器或在其他情况下处于空闲状态。我需要使用令牌注销用户。

我正在使用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>

与此相关的是,当用户尝试访问网站中的任何链接时,此代码将执行,并且他们需要再次登录。

我可以做些什么来避免仅通过转到另一个链接就可以运行此代码,或者可以做些其他事情来获得相似的结果?

1 个答案:

答案 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