2

在我的 php 应用程序中,我使用 $_SESSION 来跟踪用户是否登录。如果用户在我的网站上离开http://mysite.com的任何页面并转到http://someotherwebsite.com,我想要自动注销他们,这样如果他们返回http://mysite.com上的任何页面,他们需要再次登录。

是否有捷径可寻?

4

7 回答 7

11

您无法明确判断用户何时离开您的网站,最好的办法是在会话中实施超时。

正如大多数答案所说,您可以检查 JavaScript 事件onbeforeunload,但用户可以通过禁用 JavaScript 来绕过它,或者正如BalusC 指出的那样,使用不支持它的网络浏览器,例如 Opera。

因此,我坚信对会话实施超时是强制注销的最佳方式。

于 2010-03-24T19:39:00.243 回答
2

您可以在onbeforeunload事件中对某些将终止会话的服务器端脚本执行 AJAX 调用。

于 2010-03-24T19:41:15.013 回答
2

除了在您的会话上设置超时 - 不是真的。想到的唯一方法是onbeforeunload当用户离开当前页面时触发的 JavaScript 事件,但该事件不知道用户要去哪里。但是,如果您真的想这样做,您可以根据以下 hacky 解决方法(未经测试)构建一些东西:

  • 设置一个onbeforeunload向您的服务器发送 AJAX 调用的事件。(如何成功地做到这一点 - 所以在页面关闭之前调用通过 - 是它自己的问题,在 SO 上搜索“onbeforeunload ajax”应该会产生一些结果。

  • Ajax 调用将开始倒计时,表示该用户的会话将在 15 秒后终止。

  • 如果用户要离开您的网站,则倒计时适用。

  • 如果用户要转到您网站上的不同页面,则在提供下一页时清除所有“死亡”倒计时。

这可能是不稳定的,因为在下一页已经消除了该倒计时之后,开始倒计时的 Ajax 请求可能会到达服务器。但如果你真的需要这样做,这可能是一个方向。当然,仅适用于启用 JS 的用户。

于 2010-03-24T19:42:03.837 回答
2

如何实现这一点的第二个想法是在会话上设置一个极低的超时时间(例如 90 秒),并iframe在您服务的每个页面上设置一个。然后,该 iframe 将每 60 秒调用一次该页面。

这可以在没有 JavaScript 的情况下工作,但可能会在旧版本的 Internet Explorer 中产生烦人的点击噪音(我不知道是在 6 还是 7 中停止的?)

于 2010-03-24T20:40:03.697 回答
0

您不能(但您的会话会在一段时间后自动超时;因此您可以将超时设置为较短的时间)。

于 2010-03-24T19:39:27.713 回答
0

根据我对 PHP 的了解(不多),您的应用程序会知道他们离开了网站吗?如果您访问 someotherwebsite.com,则不会再次调用您的代码,直到它们返回。

于 2010-03-24T19:40:56.183 回答
0

不幸的是,并非如此,这是 Web 应用程序的大问题之一。您的应用程序无法知道浏览器已转移到不同的网站。

正如 ChristohpeD 提到的,您可以设置会话超时。请记住,您的站点只会刷新服务器收到帖子或某种 javascript ping 的时间。

希望有帮助

于 2010-03-24T19:46:05.030 回答