2012-08-17 36 views
1

正如标题所述,我想在关闭窗口时删除Cookie。我知道用于Cookie的方法,如Cookies.removeCookie(Constants.XXX);以及用于删除Cookie的cookie.setMaxAge(0); 。但是,这是通过点击注销完成的。如何在窗口关闭时或应用程序重新运行时删除servlet中的cookie

我想删除关闭窗口或应用程序停止运行时的cookie。因为无论何时,我正在调试应用程序,每当我重新运行应用程序时,即使我没有登录并且会话尚未为用户启动,我仍然看到cookie仍然存在。因此,即使用户尚未设置cookie,也存在冲突,即使用户仍未登录!

它是一个GWT应用程序。

+0

http://stackoverflow.com/questions/3986430/how-we-call-logout-servlet-on-browser-close-event – kosa 2012-08-17 19:00:31

回答

2

首先,区分客户端的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。)