2009-05-21 128 views
117

如何删除Java Servlet中的Cookie?如何删除Java Servlet中的Cookie

我尝试这样做: http://www.jguru.com/faq/view.jsp?EID=42225

编辑:下面现在工作顺利这似乎是的组合:

response.setContentType("text/html"); 

cookie.setMaxAge(0); 

之前我做的:

//remove single signon cookie if it hasn't been validated yet 
response.setContentType("text/html"); 
Cookie cookie = new Cookie(SSORealm.SSO_COOKIE_NAME, ""); 
cookie.setDomain(SSORealm.SSO_DOMAIN); 
cookie.setMaxAge(-1); 
cookie.setPath("/"); 
cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis()); 
response.addCookie(cookie); 

根据the documentation关闭浏览器时,该cookie到期。

负值意味着cookie不会永久存储,并且在Web浏览器退出时将被删除。零值会导致Cookie被删除。

完整的工作片断过期饼干是:

//remove single signon cookie if it hasn't been validated yet 
response.setContentType("text/html"); 
Cookie cookie = new Cookie(SSORealm.SSO_COOKIE_NAME, ""); 
cookie.setDomain(SSORealm.SSO_DOMAIN); 
cookie.setMaxAge(0); 
cookie.setPath("/"); 
cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis()); 
response.addCookie(cookie); 

回答

117

MaxAge of -1表示您希望cookie在会话期间持续存在。您想要将MaxAge设置为0。

API documentation

负值意味着cookie不会永久存储,当Web浏览器退出将被删除。零值会导致Cookie被删除。
+8

我最初在firefox中尝试过setMaxAge(0),但我仍然看到它在我的cookies中列为“Expires:在会话结束时”,并认为我的servlet仍在接收过期的cookie。 它可能是需要设置response.setContentType(“text/html”)的组合。 和 setMaxAge(0); ,使它终于工作。 我再次尝试它,它确实显示cookie和setMaxAge(0)不会被发送到我的Java servlets的后续请求。 – Dougnukem 2009-05-21 19:00:48

+0

清楚和有用的答案,谢谢。 – 2014-07-29 01:56:49

11

请记住,一个cookie实际上是由它的名称,路径和域的元组定义。如果这三者中的任何一个不同,或者存在多个同名的Cookie,但使用路径/域定义的URL仍然可以针对相关网址显示,您仍然会看到该cookie传递给请求。例如。如果网址为“http://foo.bar.com/baz/index.html”,则会看到在bar.com或foo.bar.com上定义的任何Cookie,或者路径为“/”或“/ baz”。

因此,只要客户端中只定义了一个名为“SSO_COOKIE_NAME”,域名为“SSO_DOMAIN”和路径为“/”的cookie,就看起来应该起作用。如果存在具有不同路径或域的cookie,您仍然会看到发送给客户端的cookie。

要进行调试,请进入Firefox的首选项 - >安全选项卡,然后使用SSO_COOKIE_NAME搜索所有cookie。点击每个来查看域和路径。我敢打赌你会在那里找到一个并不完全符合你的期望。

+0

虽然它也有可能是名或路径是,他是在浏览器中查看(一旦他修复了最大生存周期值)的cookie,其它饼干的存在与否无关与状态,存在或不存在他正在设置的特定cookie。 – 2009-05-21 01:38:19

6

这是我以前有效使用的代码,将"/"作为strPath参数传递。

public static Cookie eraseCookie(String strCookieName, String strPath) { 
    Cookie cookie = new Cookie(strCookieName, ""); 
    cookie.setMaxAge(0); 
    cookie.setPath(strPath); 

    return cookie; 
} 
6
Cookie[] cookies = request.getCookies(); 
if(cookies!=null) 
for (int i = 0; i < cookies.length; i++) { 
cookies[i].setMaxAge(0); 
} 

这样做没有奏效?如果响应被发回,这将删除所有cookie。

+11

不要忘记将更改的cookie添加回response.addCookie(cookies [i]); – 2012-11-29 10:51:58

50

在我的环境中,下面的代码工作。尽管第一眼看起来多余,但需要cookies[i].setValue("");cookies[i].setPath("/");才能正确清除cookie。

private void eraseCookie(HttpServletRequest req, HttpServletResponse resp) { 
    Cookie[] cookies = req.getCookies(); 
    if (cookies != null) 
     for (Cookie cookie : cookies) { 
      cookie.setValue(""); 
      cookie.setPath("/"); 
      cookie.setMaxAge(0); 
      resp.addCookie(cookie); 
     } 
}