如何删除Java Servlet中的Cookie

Dou*_*kem 130 java cookies servlets

如何删除Java servlet中的cookie?

我试过这个:http: //www.jguru.com/faq/view.jsp?EID = 42225

编辑:以下现在成功运作它似乎是以下的组合:

response.setContentType("text/html");
Run Code Online (Sandbox Code Playgroud)

cookie.setMaxAge(0);
Run Code Online (Sandbox Code Playgroud)

在我做之前:

//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);
Run Code Online (Sandbox Code Playgroud)

根据文档关闭浏览器时,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);
Run Code Online (Sandbox Code Playgroud)

Cur*_*son 130

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

API文档:

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

  • 我最初在firefox中尝试了setMaxAge(0),但我仍然看到它在我的cookie中列为"Expires:at session of session",并认为我的servlet仍在接收过期的cookie.它可能是需要设置response.setContentType("text/html")的组合; 和setMaxAge(0); 这使它终于奏效了.我再次尝试了,看起来似乎不会在后续的Java servlet请求中发送带有setMaxAge(0)的cookie. (8认同)

小智 57

在我的环境中,以下代码有效.虽然乍看上去多余的,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);
        }
}
Run Code Online (Sandbox Code Playgroud)

  • cookie.setPath(...) 需要匹配创建 cookie 时使用的任何路径(cookie 名称和域相同)。 (3认同)
  • 我不确定您应该设置cookie的值还是路径,因为它可能被视为另一个cookie,对吗?要清除Cookie,您只能将max-age设置为0。 (2认同)

bro*_*ofa 12

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

因此,只要客户端中只定义了一个cookie,其名称为"SSO_COOKIE_NAME",域名为"SSO_DOMAIN",路径为"/",那么您看起来应该可以使用.如果有任何具有不同路径或域的cookie,您仍会看到发送给客户端的cookie.

要调试此功能,请进入Firefox的首选项 - >安全选项卡,然后搜索包含SSO_COOKIE_NAME的所有Cookie.单击每个以查看域和路径.我打赌你会在那里找到一个并不是你所期待的那个.


aho*_*ich 7

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

那不起作用吗?如果发回响应,这将删除所有cookie.

  • 不要忘记使用response.addCookie(cookies [i])将更改后的cookie添加回响应中; (13认同)

Kev*_*son 6

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

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

    return cookie;
}
Run Code Online (Sandbox Code Playgroud)