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

如果您关闭浏览器,会删除会话cookie,那么为什么不关闭标签以获得相同的结果呢?

因此,我正在使用PHP5和jQuery。有什么我可以这样做,当一个标签关闭时,我可以解决这个会话问题?不幸的是,BODY标记上的onbeforeunload事件在这里没有用,因为当你点击页面时它会触发该事件,而不仅仅是关闭一个标签。

有帮助吗?

解决方案

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

我并不知道任何真正的方法。

其他提示

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

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

  1. 不想要会话;
  2. 需要制作自己的“迷你会话”基础设施;
  3. 可能是为了一个受伤和错误的世界。

您还可以编写一个javascript来检测标签何时关闭,并删除javascript中的cookie

如果您需要依赖制表符关闭,可以使用会话网络存储而不是cookie。

我找到了一个解决方法。

我正在使用 ASP.NET C#。除了 Login 页面之外,我有一个 Master Page 用于网站的所有页面。在母版页服务器<代码>页面加载事件中,我获得了引用页面的 Url ,并检查它是否包含网站的根目录,如果不是我重定向到 Login 页面,因为它没有显示 Master Page

如果我尝试从其他网站访问某个页面,或者我将 Url 输入到浏览器的地址框,则此方法有效。因此,如果您关闭选项卡并尝试从其他选项卡重新输入或重新打开选项卡,即使cookie未被杀死,您也无法通过 Login 重新进入该站点。即使您尚未关闭选项卡并在同一选项卡中的不同站点之间导航,这也可以正常工作。

这是代码

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

当从网站内导航时,即使您打开指向该网站中另一个页面的链接,也没有问题。

如果您想进一步确定在重新启动 Login 页面之前可以在 if 子句中终止会话和身份验证cookie。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top