题
我在网站上使用基于会话的Cookie。令我完全惊讶的是,我注意到如果我设置会话cookie(不是持久性cookie),关闭选项卡,然后重新连接到站点,会话cookie仍然存在。实际上,这不是我所期望的。我原以为会删除会话cookie。
如果您关闭浏览器,会删除会话cookie,那么为什么不关闭标签以获得相同的结果呢?
因此,我正在使用PHP5和jQuery。有什么我可以这样做,当一个标签关闭时,我可以解决这个会话问题?不幸的是,BODY标记上的onbeforeunload事件在这里没有用,因为当你点击页面时它会触发该事件,而不仅仅是关闭一个标签。
解决方案
会话cookie是按进程而不是每个窗口。因此,即使您选择了新窗口,您仍然可以获得相同的会话ID。这种行为是有道理的。您不希望用户在浏览您的网站时每次打开新窗口时重新登录。
我并不知道任何真正的方法。
其他提示
这是设计并试图改变它是一个非常糟糕的主意。如果用户在新标签页中打开链接并关闭该链接,该怎么办?是否应销毁原始标签中的会话?当然不是!这证明了为什么你甚至不应该考虑这个。
会话在最后一个浏览器窗口关闭时结束。如果你想要别的东西,你:
- 不想要会话;
- 需要制作自己的“迷你会话”基础设施;
- 可能是为了一个受伤和错误的世界。 醇>
您还可以编写一个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,但它可以帮助防止在关闭选项卡后无需登录就重新进入站点。