【问题标题】:Problem removing cookie in servlet在 servlet 中删除 cookie 的问题
【发布时间】:2011-03-28 19:59:30
【问题描述】:

我尝试使用此代码删除 servlet 中的 cookie

Cookie minIdCookie = null;

for (Cookie c : req.getCookies()) {
    if (c.getName().equals("iPlanetDirectoryPro")) {
        minIdCookie = c;
        break;
    }
}

if (minIdCookie != null) {
    minIdCookie.setMaxAge(0);
    minIdCookie.setValue("");
    minIdCookie.setPath("/");
    res.addCookie(minIdCookie);
}

res.flushBuffer();

但这不会产生任何影响,也不会改变 cookie 属性。

我也试过在这个 servlet 中添加一个 cookie,效果很好。

为什么我无法更改现有 cookie 的属性。

【问题讨论】:

    标签: java http servlets cookies


    【解决方案1】:

    您不应该更改路径。这将改变 cookie 的身份。如果 cookie 设置为 /foo 之类的路径,并且您将其更改为 /,则客户端将不再将更改后的 cookie 与原始 cookie 关联。 cookie 由名称和路径标识。

    只需将 maxage 设置为 0 就足够了。

    Cookie[] cookies = request.getCookies();
    if (cookies != null) { // Yes, this can return null! The for loop would otherwise throw NPE.
        for (Cookie cookie : cookies) {
            if (cookie.getName().equals("iPlanetDirectoryPro")) {
                cookie.setMaxAge(0);
                response.addCookie(cookie);
                break;
            }
        }
    }
    

    您还需要确保您在随后的new请求中读取/测试cookie,而不是在当前请求中。

    【讨论】:

    • 问题是我尝试使用路径“/admin”更改 cookie,而我的 servlet 路径是“/admin/”。是否无法删除另一个路径或另一个域上的 cookie?
    • 您可以删除同一域的另一个路径上的 cookie。您只需将其最大值设置为 0。您不应该更改路径。它只会创建一个新的 cookie(它会立即消失,因为 maxage 为 0)。您无法访问其他域上的 cookie。这是一个安全限制。您可以最高访问另一个子域的 cookie。您只需要将域设置为.example.com 而不是example.com
    【解决方案2】:

    我知道这已经有几年了,但是 BalusC 上面给出的答案并不完全正确,Stefan 接受的答案也没有真正提供所有细节。

    当您在 Java 中检索 cookie 时,路径和域将始终为空,因为它们仅在客户端浏览器的响应中是必需的。但是,如果您在同一个安全域中(无论路径如何),您仍然有权删除它们。不幸的是,由于不包含路径,您现在无法在不明确知道该路径的情况下删除 cookie。简单地使用相同的 cookie 名称,但使用不同的路径是行不通的。这些被认为是两个不同的 cookie,您会发现您没有删除 cookie,而是在不同的路径上创建了另一个。

    大多数开发人员遇到的另一个问题是他们尝试在提交响应之前检查是否缺少 cookie。在客户端浏览器可以读取响应并将其从文件系统中删除之前,不会删除 cookie。如果您转发到另一个 servlet 并希望您删除了一个 cookie,您会发现它仍然存在(因为初始请求是相同的)。从这个意义上说,请求属性是一个更好的选择。

    【讨论】:

      【解决方案3】:

      大多数时候问题出在 cookie 的路径上。 因此,请注意在创建 cookie 时指定路径。 然后在丢弃 cookie 时使用相同的路径。 路径的概念是

      public String getPath() public void setPath(String path) 这些方法 获取或设置 cookie 应用的路径。如果您不指定 路径,浏览器仅将 cookie 返回到 包含发送 cookie 的页面的目录。例如,如果 服务器从 //ecommerce.site.com/toys/specials.html,浏览器会发送 连接到时返回 cookie //ecommerce.site.com/toys/bikes/beginners.html,但不是 //ecommerce.site.com/cds/classical.html。 setPath 方法可以 用于指定更一般的东西。例如, someCookie.setPath("/") 指定服务器上的所有页面都应该 接收 cookie。指定的路径必须包含当前页面; 也就是说,您可以指定比默认路径更通用的路径,但不能 一个更具体的。因此,例如,一个 servlet 在 //host/store/cust-service/request 可以指定 /store/ 的路径 (因为 /store/ 包括 /store/cust-service/)但不是 /store/cust-service/returns/(因为这个目录不包括 /store/cust-service/)。

      要获取有关路径和 cookie 相关属性的更多信息,您可以访问here

      【讨论】:

        【解决方案4】:

        问题是我要删除的 cookie 的路径是“/admin”,而我的注销 servlet 的路径是“/admin/logoutServlet”。当我从请求中获取 cookie 时,路径设置为 null。因此,当我添加 cookie 时,路径设置为“/admin/”作为我的 servlet 如果我创建了一个路径为“/admin/”的 cookie,则 servlet 能够将其删除。

        我通过在将 cookie 添加到响应之前明确设置 cookie 的路径解决了这个问题。

        minIdCookie.setMaxAge(0);
        minIdCookie.setPath("/");
        res.addCookie(minIdCookie);
        

        但我不明白为什么路径为空。

        【讨论】:

        • Path 始终为 null,因为它仅在响应中需要。当一个请求进来时,它是不需要的(或者他们声称),因此没有设置。
        【解决方案5】:

        我认为最好使用null 而不是空字符串。 IE。改变 minIdCookie.setValue("");minIdCookie.setValue(null);

        【讨论】:

          猜你喜欢
          • 2015-10-26
          • 1970-01-01
          • 2011-09-05
          • 2011-12-24
          • 1970-01-01
          • 2011-10-31
          • 2011-08-05
          • 2010-10-27
          • 2012-04-06
          相关资源
          最近更新 更多