2009-11-04 151 views
2

我有例子,我需要在用户关闭浏览器窗口时关闭会话。 我试过page_unload()不起作用。 这个例子是:我有父窗口,窗口将从它打开我需要删除会话时,用户关闭子窗口。 请我需要一些帮助。我想检测用户关闭浏览器窗口时?

+0

复制 http://stackoverflow.com/参考问题/ 920042/kill-server-side-session-on-browser-window-close-closed http://stackoverflow.com/questions/287022/closing-the-browser-should-actually-clear-the-session- variables-an-asp-net-sessio – 2009-11-04 18:03:11

回答

1

不幸的是,这是不可能的。你可以在网上找到声称他们可以这样做的例子,但它们有时以非常微妙的方式存在缺陷。

0

没有一致的方式来检测通过JavaScript关闭浏览器。如果您担心挂起的会话太多,请减少服务器上的会话超时。如果你这样做,你也会想通知你的用户他们需要保持活跃状态​​,以免失去任何工作。

10

这不是在正常的web http协议中提供的。当浏览器关闭时,没有真正的方法可以确切知道;你只能“排序”知道。你必须拼凑一个丑陋的黑客才能获得任何确定性,即使如此,它必然会在大量边缘案例中失败或导致令人讨厌的副作用。

正常的解决方法是每隔一段时间从浏览器向服务器发送ajax请求以设置一种“心跳”。当心跳停止时,浏览器关闭,因此您终止会话。但是,再次:这是一个可怕的黑客。在这种情况下,主要的问题是,如果服务器和客户端出现不同步或出现javascript错误,并且存在会话永远不会过期的副作用,那么对于失败的心跳信号容易出现误报。

+4

+1:唯一的例外是如果你正在运行某种与服务器不断通信的内联Java(或类似的)applet,并且唯一的原因是因为它在常规的HTML频道之外运行。 HTML不是一个有状态的协议,任何尝试使用JavaScript都是如此的方法是最好的。 – Satanicpuppy 2009-11-04 18:08:26

0

如果您的客户端脚本发送一个AJAX心跳到你的服务器端应用程序,你可能使用丢失的节拍关闭会话。

0

你有父窗口的所有子窗口 你需要的onfocus检查子窗口 所以当你的父母得到重点检查,如果孩子出现与否