【问题标题】:How do you remove a Cookie in a Java Servlet如何删除 Java Servlet 中的 Cookie
【发布时间】: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);

【问题讨论】:

    标签: java servlets cookies


    【解决方案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);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-10-26
            • 2013-07-22
            • 2011-03-28
            • 2012-04-06
            • 2016-03-31
            • 2013-04-04
            • 2011-01-09
            • 2015-02-24
            相关资源
            最近更新 更多