【问题标题】:Why Doesn't Closing A Tab Delete A Session Cookie?为什么关闭选项卡不会删除会话 Cookie?
【发布时间】:2010-10-22 19:07:52
【问题描述】:

我在我的网站上使用基于会话的 cookie。令我完全惊讶的是,我注意到如果我设置了一个会话 cookie(不是持久性 cookie),关闭一个选项卡,然后重新连接到该站点,会话 cookie 仍然存在。实际上,这不是我所期望的。我本来希望会话 cookie 被删除。

如果关闭浏览器,会话 cookie 会被删除,那么为什么不关闭选项卡以获得相同的结果呢?

因此,我使用的是 PHP5 和 jQuery。我有什么办法可以在关闭选项卡时解决此会话问题?不幸的是,BODY 标记上的 onbeforeunload 事件在这里没有用,因为当您点击离开页面时,它会触发该事件,而不仅仅是关闭选项卡。

【问题讨论】:

    标签: session cookies tabs


    【解决方案1】:

    这是设计使然,试图改变它是一个非常糟糕的主意。如果用户在新选项卡中打开一个链接并关闭它怎么办?是否应该销毁原始选项卡中的会话?当然不是!这说明了为什么你甚至不应该考虑这个。

    当最后一个浏览器窗口关闭时会话结束。如果你想要别的东西,你:

    1. 不想要会话;
    2. 需要制作自己的“迷你会话”基础架构;
    3. 可能会陷入一个充满伤害和错误的世界。

    【讨论】:

    • 这里的问题是一个公共环境,比如图书馆,以及一个包含身份信息的在线个人资料。我需要想出一个解决方案。
    • 尽管如此,您似乎对这个问题有几个很好的答案,应该选择其中一个作为正确答案。也许您还想提出一个新问题?
    • 假设打开一个新标签并销毁以前的标签会话是一个坏主意是错误的。这个想法实际上被证明对于需要额外安全性的网站是有益的,因为用户不会再次登录并触发某些 API。他们可以为更好的用户界面服务。所以不,如果 Stackoverflow 授予我额外的投票权,我会将这个答案投反对票。
    【解决方案2】:

    会话 cookie 是每个进程而不是每个窗口。因此,即使您选择了新窗口,您仍然会获得相同的会话 ID。这种行为是有道理的。您不希望用户在浏览您的网站时每次打开新窗口时都重新登录。

    我不知道有什么真正的方法可以解决这个问题。

    【讨论】:

    • Paul,请参阅下面我对 Sander 的评论,开头是“这里的问题......”
    • 在这种情况下,标签关闭不是主要问题。它更积极地控制会话的到期。您需要在 JS 中的客户端上实现某种活动超时,在没有用户活动后自动注销。您会在大多数银行网站上发现这种行为。
    • 保罗,你是对的。我在这个问题上睡了,这就是我计划采取的行动方针。现在提出另一个关于实现它的最佳方式的 stackoverflow 问题。
    • 我认为如果有人想出跨平台的 hack/kludge 以 90% 的准确率检测标签刚刚关闭而不是以任何其他方式关闭页面,他们将成为网络上的英雄.
    【解决方案3】:

    您还可以编写一个 javascript 来检测选项卡何时关闭并删除 javascript 中的 cookie

    【讨论】:

    • 你怎么能这样做?
    • 尝试在 beforeunload 事件中添加监听器
    • 我做了这样的事情 $(window).scroll(function() { if (sessionStorage.getItem('advertOnce') !== 'true') { sessionStorage.setItem('advertOnce', 'true'); initPopup(); } });
    • @Hammer beforeunload 事件也会在用户单击任何链接等时触发,而不是仅关闭选项卡。
    【解决方案4】:

    如果您需要依赖标签关闭,可以使用会话网络存储来代替 cookie。

    【讨论】:

    【解决方案5】:

    我找到了解决办法。

    我在ASP.NET C# 工作。除了Login 页面外,我对网站的所有页面都有一个Master Page。在Master Page Sever Page Load event 中,我得到了引用页面的Url,并检查它是否包含站点的根目录,如果不是,我重定向到Login 页面,因为它没有那个@ 987654329@它显示。

    如果我尝试从另一个站点访问一个页面,或者如果我在浏览器的地址框中输入Url,这将有效。因此,如果您关闭选项卡并尝试从另一个选项卡重新进入或重新打开选项卡,即使 cookie 没有被杀死,您也无法在不通过 Login 的情况下重新进入该站点。即使您没有关闭标签并在同一标签中的不同站点之间导航,这也有效。

    这是代码

       if (Request.UrlReferrer == null || !Request.UrlReferrer.AbsoluteUri.ToString().Contains("root"))
            {
                Response.Redirect("~/Account/Login.aspx");
            }
    

    从站点内导航时,即使您打开指向站点中另一个页面的链接到它打开的另一个选项卡,也没有问题。

    如果您还想确保可以在重定向到 Login 页面之前终止 if 子句中的会话和身份验证 cookie。

    当用户导航到同一选项卡中的另一个站点并按下浏览器的back to 按钮时,这将不起作用,因为这适用于缓存并且不会自动向服务器发送请求。

    因此,这不会在关闭选项卡时终止会话或身份验证 cookie,但它可以帮助防止在关闭选项卡后重新进入站点而不登录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多