首先,区分客户端的cookie和服务器端的会话很重要(我想您已经知道了)。
通常,要清除注销,您需要在服务器端拨打session.invalidate()
,在客户端拨打Cookies.removeCookie(...)
。
但并不是每一个“退出”是干净的:
- 注销请求可能不会使它的服务器
- 浏览器可能会崩溃,你接到电话前removeCookie - 因此,任何试图在删除一个cookie窗口关闭将不可靠
在服务器端,您可以使用超时(请参阅@thinksteep提供的链接:How we call logout servlet on browser close event)。
对于客户端Cookie,您可以设置expiryDate/maxAge。或者您可以使用“会话cookie”:这些cookie根本不会设置过期或maxAge。浏览器重新启动时,大多数浏览器会自动删除“会话cookie” - 但请参阅Firefox session cookies。
所有这一切的意思是,饼干也许不是你的使用情况最好的技术:一般情况下,一个cookie是设计在所有浏览器标签可用,浏览器会话的概念,甚至不总是在浏览器/窗口关闭时结束(反正在智能手机上意味着什么?)。这对于许多当前的网站来说是可取的(用户不必每次都明确登录),并且许多用户已经期望这种行为。
对于需要“一个标签=一个会话”策略的网站,最好存储一个令牌,例如在一个Javascript(或GWT)对象中,并且每一个请求都发送它。这样,您可以从多个浏览器选项卡单独登录 - 即使是不同的用户 - 一旦选项卡关闭,令牌就会消失。请注意,浏览器在会话恢复时仍然可以恢复选项卡。 (我总是会将此技术与httponly cookie结合使用,以避免certain kinds of attacks。)
http://stackoverflow.com/questions/3986430/how-we-call-logout-servlet-on-browser-close-event – kosa 2012-08-17 19:00:31