如何在Java Servlet中删除Cookie


135

如何在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);

根据文档关闭浏览器时,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);

Answers:


137

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

API文档中

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

9
我最初在firefox中尝试了setMaxAge(0),但是我仍然看到它在cookie中列为“ Expires:在会话结束时”,并认为我的servlet仍在接收该过期的cookie。可能是需要设置response.setContentType(“ text / html”);的组合。和setMaxAge(0); 最终使它起作用。我再试一次,但看起来在以后的请求中不会将带有setMaxAge(0)的cookie发送到我的Java servlet。
09年

62

在我的环境中,以下代码有效。虽然看起来冗余乍看之下,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
这似乎在所有浏览器上都能一致地工作。
2013年

5
我不确定您应该设置cookie的值还是路径,因为它可能被视为另一个cookie,对吗?要清除Cookie,您只能将最大年龄设置
灰色,

2
cookie.setPath(...)需要匹配创建cookie时使用的任何路径(与cookie名称和域相同)。
markus

12

请记住,cookie实际上是由其名称,路径和域的元组定义的。如果这三个中的任何一个不同,或者有多个同名的Cookie,但定义的URL /路径对于所讨论的URL仍然可见,您仍然会看到该Cookie在请求中传递。例如,如果网址是“ http://foo.bar.com/baz/index.html ”,则您会看到在bar.com或foo.bar.com上定义的任何cookie,或者路径为“ /”或“ / baz”。

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

要进行调试,请进入Firefox的首选项->“安全性”选项卡,并使用SSO_COOKIE_NAME搜索所有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);
}

那没有用吗?如果发送回响应,则将删除所有cookie。


15
不要忘记使用response.addCookie(cookies [i]);将更改后的cookie添加回响应中。
Philihp Busby 2012年

7

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

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

    return cookie;
}

0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.