如何在Java Servlet中删除Cookie

147

如何在Java servlet中删除cookie?

我尝试了以下方法: http://www.jguru.com/faq/view.jsp?EID=42225

编辑:下面的方法可以成功删除cookie,看起来是以下两种方法结合使用:

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);

根据文档,当浏览器关闭时,会使cookie过期。

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

完整的使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);
8个回答

150

当MaxAge的值为-1时,表示你想要cookie在会话期间一直保持。相反地,你应该将MaxAge设置为0。

根据API文档

MaxAge的负值意味着cookie不会被持久性存储,并且当Web浏览器退出时将被删除。将MaxAge的值设为0会导致cookie被删除。

9
我最初在Firefox中尝试使用setMaxAge(0),但仍然在我的cookie中看到它列为“ Expires:at end of session”,并认为我的servlet仍在接收该过期cookie。也许需要设置response.setContentType(“text / html”); 和 setMaxAge(0);才能最终使其工作。我再次尝试,看起来使用setMaxAge(0)的cookie将不会在随后的请求中发送到我的Java servlet。 - Dougnukem

74
在我的环境中,以下代码可以工作。虽然乍一看有些冗余,但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);
        }
}

1
这似乎在所有浏览器中都能一致地工作。 - ug_
7
你不确定应该设置cookie的值还是路径,因为那可能会被视为不同的cookie,对吧?要清除cookie,你只需将最大年龄(max-age)设置为0即可。 - Gray
4
cookie.setPath(...) 需要与创建 cookie 时使用的路径相匹配(cookie 名称和域也是如此)。 - markus

14
请记住,一个 cookie 实际上是由其名称、路径和域的元组定义的。如果这三个中的任何一个不同,或者有多个具有相同名称但使用的路径/域仍可能对所访问的 URL 可见的 cookie,则仍将看到该 cookie 传递给请求。例如,如果 URL 是 "http://foo.bar.com/baz/index.html",你会看到在 bar.com 或 foo.bar.com 上定义的任何 cookie,或者在 "/" 或 "/baz" 上具有路径的 cookie。
因此,只要客户端中定义了一个名为 "SSO_COOKIE_NAME",域为 "SSO_DOMAIN",路径为 "/" 的 cookie,您所拥有的东西看起来就应该能够正常工作。如果有任何具有不同路径或域的 cookie,则仍将发送 cookie 给客户端。
要调试此问题,请进入 Firefox 的首选项 -> 安全选项卡,并搜索所有具有 SSO_COOKIE_NAME 的 cookie。单击每个 cookie 查看其域和路径。我敢打赌你会发现其中一个与你的预期略有不同。

虽然另外一种可能是cookie的名称或路径并不是他在浏览器中查看的那个(一旦他修复MaxAge值),但其他cookie的存在或不存在与他所设置的特定cookie的状态、存在或不存在无关。 - cjs

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

这个方法是否没有起作用?如果响应被发送回来,这将删除所有的cookies。


19
别忘了使用response.addCookie(cookies[i])将变化后的cookie加回到响应中。 - Philihp Busby

8

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

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

    return cookie;
}

4

移除cookie的正确方式是将最大过期时间设置为0,并将cookie添加回HttpServletResponse对象中。

大多数人并没有意识到或忘记将cookie添加回响应对象中。通过这样做,它将立即过期并删除cookie。

...retrieve cookie from HttpServletRequest
cookie.setMaxAge(0);
response.addCookie(cookie);

0

当客户端向服务器传递 cookie 时,它只包含键/值对,没有其他内容。这意味着,当服务器接收到 cookie 时,它不知道:

  • 此 cookie 是否为 http-only
  • 此 cookie 是否为安全的
  • 此 cookie 的域
  • 此 cookie 的路径

因此,您可能需要根据 Chrome 开发人员面板中 cookie 的域和路径手动设置域和路径。

假设您有一个 cookie:

  • 键 = 假饼干

  • 值 = 假值

  • 域名 = .bar.com

  • 路径 = /

  • 然后,如果您编写的服务器代码如下,它将无法正常工作:

          cookie.setValue("");
          cookie.setPath("/");
          cookie.setMaxAge(0);
          resp.addCookie(cookie);
    
因为当浏览器接收到您的响应时,它将通过名称、路径和域名将set-cookie头与本地cookie进行匹配。
以下代码有效:
        cookie.setValue("");
        cookie.setPath("/");
        cookie.setMaxAge(0);
        cookie.setDomain(".bar.com");
        cookie.setPath("/");
        resp.addCookie(cookie);

0

一个特殊情况:cookie没有路径。

在这种情况下,将路径设置为cookie.setPath(request.getRequestURI())

Javascript设置cookie时没有路径,因此浏览器仅将其显示为当前页面的cookie。如果我尝试使用path == /发送过期的cookie,则浏览器会显示两个cookie:一个已过期的path == /和另一个path == current page


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接