如何在 JavaServlet 中删除 Cookie

如何删除 Javaservlet 中的 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);
239034 次浏览

请记住,cookie 实际上是由它的名称、路径和域的元组定义的。如果这三者中的任何一个不同,或者有不止一个相同名称的 cookie,但是定义的路径/域仍然可以看到有问题的 URL,您仍然可以看到在请求中传递的 cookie。例如,如果 URL 是“ 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。点击每一个查看域和路径。我打赌你会在里面找到一个跟你想象的不太一样的。

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

来自 API 文档:

负值意味着 Cookie 不会持久存储,并且在 Web 浏览器退出时将被删除。如果值为零,则会删除 Cookie。

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

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


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

这不工作吗? 这删除所有的 cookie,如果响应发送回来。

在我的环境中,下面的代码可以工作。虽然乍看起来多余,但是 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.setPath(request.getRequestURI())

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

删除 cookie 的正确方法是将最大年龄设置为0,并将 cookie 添加回 HttpServletResponse 对象。

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

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

当 cookie 从客户机传递到服务器时,它只包含键/值对,没有其他内容。也就是说,当服务器收到 cookie 时,它不知道

  • 如果这个 cookie 是 http-only
  • 如果这块饼干是安全的
  • 这个 cookie 的领域
  • 这块饼干的路径

所以你可能必须手动设置域和路径根据 Cookie 的域和路径在 Chrome 开发者面板。

假设你有一块饼干:

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