-1

可能重复:
定时自动注销和浏览器关闭

我将网站的用户使用情况存储在 mysql 表中,并且我能够在登录时使用插入查询来捕获和存储登录时间,如果用户选择通过注销,我也会捕获注销时间注销按钮。

但是如果用户只是关闭浏览器,那么我该如何触发注销时间的查询。

到目前为止我得到的是这个,但是有了这个我可以解决会话超时问题,但不能解决“浏览器关闭”

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) 

   {

    // last request was more than 30 minates ago
      session_unset();     // unset $_SESSION variable for the runtime 
      session_destroy();   // destroy session data in storage

   }

  $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

请帮我解决这个问题..

4

5 回答 5

4

没有可靠的方法可以知道用户是否关闭了浏览器或从您的站点导航到其他地方 - 这是因为 HTTP 的无状态特性,这意味着一旦下载内容,服务器和浏览器(大部分)。

您可能会使用一些 ajax 请求来“ping”您的服务器 - 一旦 ping 下降,您可以假设他们已经关闭了您网站的所有页面。这很糟糕,因为它无用地增加了网络流量,并且意味着您的服务器将处理更多的请求而没有真正的功能增益。

于 2012-10-08T11:53:38.623 回答
2

beforeunload使用浏览器事件可以减少一种资源使用和更少的中继过程。

在浏览器事件上向服务器发送 ajax 请求 beforeunload并插入用户注销时间。

SLAKS关于如何捕获浏览器窗口关闭事件的一个很好的答案?** 是

每当用户出于任何原因离开您的页面时,都会触发该beforeunload事件。

例如,如果用户提交表单、单击链接、关闭窗口(或选项卡)或使用地址栏、搜索框或书签进入新页面,它将被触发。

您可以使用以下代码排除表单提交和超链接(其他框架除外):

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind("beforeunload", function() { 
    return inFormOrLink || confirm("Do you really want to close?"); 
})

live方法不适用于submit事件,因此如果您添加一个新表单,您还需要将处理程序绑定到它。请注意,如果不同的事件处理程序取消提交或导航,如果稍后实际关闭窗口,您将丢失确认提示。您可以通过在提交和点击事件中记录时间来解决这个问题,并检查是否在beforeunload几秒钟后发生。

于 2012-10-08T12:00:44.490 回答
1

您无法跟踪浏览器的关闭。您可以跟踪选项卡的弹出或关闭。

你不能依赖beforeunload。我认为它与浏览器不兼容。

于 2012-10-08T12:28:41.537 回答
-1

这是我测试过的,当浏览器关闭时它对我有用

session_start();
    if (!isset($_SESSION['LAST_ACTIVITY'])) {
        // initiate value
        $_SESSION['LAST_ACTIVITY'] = time();
    }
    if (time() - $_SESSION['LAST_ACTIVITY'] > 1800) {
        // last activity is more than 10 minutes ago
        session_destroy();
    } else {
        // update last activity timestamp
        $_SESSION['LAST_ACTIVITY'] = time();
    }

在这里,我存储了用户每个活动的时间戳。当那个时间超过 30 分钟前,我正在注销(销毁会话)。

不确定您的应用程序是否允许这样做,但据我所知,这是我过去在这类场景中实现的方式

查看评论后编辑

关闭浏览器不会触发对服务器的任何请求,因此您无法知道用户关闭了他的浏览器。您可以使用侦听器来让会话超时,然后在发生这种情况时存储当前时间

当浏览器关闭时,您可以通过对 window.onbeforeunload 或 window.onunload 进行 ajax 调用来与服务器通信

我上面的解决方案将允许您在某些活动后时间到期时自动注销用户

于 2012-10-08T11:49:44.943 回答
-2

当用户关闭浏览器时,会话无论如何都会被销毁。所以你不必破坏它。

于 2012-10-08T11:47:30.247 回答