如何删除 Java Servlet 中的 Cookie

Posted

技术标签:

【中文标题】如何删除 Java Servlet 中的 Cookie【英文标题】:How do you remove a Cookie in a Java Servlet 【发布时间】:2010-10-27 19:36:16 【问题描述】:

如何删除 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 过期的完整工作 sn-p 是:

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

【问题讨论】:

【参考方案1】:

请记住,cookie 实际上是由其名称、路径和域的元组定义的。如果这三个中的任何一个不同,或者有多个相同名称的 cookie,但定义的路径/域对于相关 URL 仍然可见,您仍然会看到该 cookie 在请求中传递。例如。如果 url 是“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。单击每个以查看域和路径。我敢打赌,你会在那里找到一个与你所期望的不太一样的。

【讨论】:

虽然也可能是名称或路径不是他在浏览器中查看的 cookie 的名称或路径(一旦他修复了 MaxAge 值),其他 cookie 的存在与否无关他设置的特定 cookie 的状态、存在与否。【参考方案2】:

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

来自API documentation:

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

【讨论】:

我最初在 Firefox 中尝试了 setMaxAge(0),但我仍然看到它在我的 cookie 中列为“过期:会话结束”,并认为我的 servlet 仍在接收过期的 cookie。可能需要设置 response.setContentType("text/html");和 setMaxAge(0);这使它终于起作用了。我又试了一次,似乎带有 setMaxAge(0) 的 cookie 不会在后续请求中发送到我的 Java servlet。【参考方案3】:

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

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

    return cookie;

【讨论】:

【参考方案4】:
Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) 
 cookies[i].setMaxAge(0);

这没有用吗?如果响应被发回,这将删除所有 cookie。

【讨论】:

不要忘记使用 response.addCookie(cookies[i]); 将更改后的 cookie 添加回响应中;【参考方案5】:

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

【讨论】:

这似乎适用于所有浏览器。 我不确定您是否应该设置 cookie 的值或路径,因为这可能会被视为不同的 cookie,对吧?要清除 cookie,您应该只将 max-age 设置为 0。 cookie.setPath(...) 需要匹配创建 cookie 时使用的任何路径(cookie 名称和域相同)。【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

删除 cookie 的正确方法是将 max age 设置为 0 并将 cookie 添加回 HttpServletResponse 对象。

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

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

【讨论】:

【参考方案8】:

当一个cookie从客户端传递到服务器时,它只包含键/值对,没有别的。这意味着,当服务器收到 cookie 时,它​​不知道

如果这个 cookie 是 http-only 如果这个 cookie 是安全的 此 cookie 的域 此 cookie 的路径

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

假设你有一个 cookie:

key = 虚拟cookie

值 = 虚拟值

域 = .bar.com

路径 = / 那么,如果你这样写服务器代码,它就行不通了:

      cookie.setValue("");
      cookie.setPath("/");
      cookie.setMaxAge(0);
      resp.addCookie(cookie);

因为当 expoler 收到您的响应时,它会将 set-cookie 标头与本地 cookie 按名称、路径和域进行匹配。

以下代码有效:

        cookie.setValue("");
        cookie.setPath("/");
        cookie.setMaxAge(0);
        cookie.setDomain(".bar.com");
        cookie.setPath("/");
        resp.addCookie(cookie);

【讨论】:

以上是关于如何删除 Java Servlet 中的 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

用idea写servlet文件

如何删除 JSP 页面中的所有“\n”? (使用 javax.servlet.Filter?)

使用 Java 删除 XML 中的空标签

第82节:Java中的学生管理系统

如何有效地破坏 Java Servlet 中的“会话”?

Java-Servlet--《12-WEB应用中的普通Java程序如何读取资源文件.mp4》 有疑问