如何删除 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的主要内容,如果未能解决你的问题,请参考以下文章