如何删除Java Servlet中的Cookie

时间:2009-05-21 00:41:47

标签: java servlets cookies

如何删除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被删除。

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

7 个答案:

答案 0 :(得分:126)

MaxAge为-1表示您希望cookie在会话期间保持不变。您想要将MaxAge设置为0。

来自API documentation

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

答案 1 :(得分:56)

在我的环境中,以下代码有效。虽然乍看之下看起来多余,但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);
        }
}

答案 2 :(得分:12)

请记住,cookie实际上是由其名称,路径和域的元组定义的。如果这三者中的任何一个不同,或者有多个同名的cookie,但定义的路径/域可能仍然对相关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。单击每个以查看域和路径。我打赌你会在那里找到一个不太符合你的期望。

答案 3 :(得分:7)

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

这不起作用吗?如果回复响应,这将删除所有cookie。

答案 4 :(得分:6)

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

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

    return cookie;
}

答案 5 :(得分:1)

删除cookie的正确方法是将最长使用期限设置为0,然后将cookie添加回HttpServletResponse对象。

大多数人没有意识到或忘记将cookie重新添加到响应对象上。这样做将使其过期并立即删除Cookie。

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

答案 6 :(得分:0)

一个特例:cookie没有路径。

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

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