【问题标题】:End session when website is left离开网站时结束会话
【发布时间】:2013-10-17 06:16:58
【问题描述】:

我正在尝试创建一个网站,只要您留在网站上,您将通过 php 会话保持登录状态,但如果您离开该网站,则会被注销。例如,当您从 mysite.com/index.php 移动到 mysite.com/otherpage.php 时,您将保持登录状态,但在您移动到 ​​othersite.com 时将被注销。这可能吗?

到目前为止,我已经尝试使用 ajax 和 jquery 在页面离开时结束会话,但这也会在页面刷新时结束会话。

$(window).unload(function(){
        $.ajax({
            type: 'POST',
            url: 'logout.php',
            async:false,
            data: {key_leave:"289583002"}
        });
    });

【问题讨论】:

  • 您可以将该 ajax 调用添加到 jQuery“click”处理程序中,仅用于您网站上的所有外部链接(可能添加一个 css 类“external”)。当用户点击其他站点时,他们将首先退出您的站点。
  • 添加一个心跳,只要用户在网页上,它就会定期访问您的服务器,然后如果错过其中一个或两个心跳,假设他们已经离开您的站点并结束会话。在外部链接上这样做不会有效,因为不是每个人都在每个网站上使用一个标签。例如,我可能会在三个不同的选项卡中同时打开您网站的三个不同区域。如果我离开其中一个而仍在使用其他的,则自动注销将带来不便。
  • 通常这是使用具有设定持续时间的会话或 cookie 来完成的,这些持续时间会在每次心跳时重置,这样如果在设定的持续时间内没有发生心跳,会话或 cookie 就会丢失,从而导致要注销的用户。
  • @KevinB 这个概念是您在单击外部站点链接之前已登录。打开多个选项卡不会对此产生任何影响...事实上,单击一个选项卡中的外部链接会使您退出所有其他选项卡,这完全符合发帖人的要求。
  • 我要说的是这样做对用户不太友好。是的,你可以这样做,它会完全满足他的要求。但我认为他没有看到这样做的真正副作用。

标签: php jquery ajax session


【解决方案1】:

无法检测到用户是否离开了您的网站(想象一下用户刚刚断开互联网但浏览器仍处于打开状态,或者通过 KILL 关闭浏览器的场景),所以基本上您无法做您想做的事情。

总之这里有一些线索:

  1. 您为什么需要它?目标是什么?尝试重新思考您的架构。
  2. 您可以将 session.cookie_lifetime 配置为 0,这意味着“直到浏览器关闭”
  3. 您可以在每个页面上添加一些javascript“ping”,例如每10秒调用一次您的脚本,或者在互联网关闭时停止调用,用户转到另一个站点并且其他选项卡中没有页面,那么您将需要单独的 cron 作业,这将破坏上次没有 ping 的用户的会话

【讨论】:

  • 我重新考虑了我的目标并得出结论,这真的不是一个要求。谢谢大家的想法,这仍然是一个有趣的场景。
【解决方案2】:

一个简单的解决方案是

a) 在服务器端 - 如果会话存在,则从数据库(在服务器上)检索用户最后一次访问页面的时间。如果太久以前让他们再次登录。否则交付页面并取消数据库的日期 b) 为获得更好的用户体验,请使用 Javascript 更新页面 (setTimeout)。

如果 (b) 不起作用(即无论出于何种原因),那么至少服务器与个人数据一起受到保护

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-28
    • 2016-03-26
    • 2012-06-15
    相关资源
    最近更新 更多