代码之家  ›  专栏  ›  技术社区  ›  Stefan Rasmusson

删除servlet中的cookie时出现问题

  •  6
  • Stefan Rasmusson  · 技术社区  · 14 年前

    我正在尝试用以下代码删除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();
    

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

    为什么我不能更改现有cookie的属性。

    5 回复  |  直到 14 年前
        1
  •  7
  •   BalusC    14 年前

    你不应该改变道路。这将更改cookie标识。如果cookie设置为 /foo / ,则客户端将不再将更改的cookie与原始cookie相关联。cookie由名称和路径标识。

    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;
            }
        }
    }
    

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

        2
  •  4
  •   user4903 user4903    11 年前

    我知道这已经有几年历史了,但是巴卢斯克给出的答案并不完全正确,斯特凡接受的答案也没有给出所有细节。

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

        3
  •  4
  •   ath j    8 年前

    大多数情况下,问题在于cookie的路径。 因此,在创建cookie时,请注意指定路径。 然后在丢弃cookie时使用相同的路径。

    public String getPath()public void setPath(String path)这些方法 获取或设置应用cookie的路径。如果你不指定 对于路径,浏览器仅将cookie返回到 包含发送cookie的页面的目录。例如,如果 服务器从发送了cookie 连接到时返回cookie //ecommerce.site.com/toys/bikes/neighters.html,但不是 //ecommerce.site.com/cds/classic.html。setPath方法可以 用来说明更一般的东西。例如, setPath(“/”)指定服务器上的所有页面 收到饼干。指定的路径必须包含当前页; 也就是说,您可以指定比默认路径更通用的路径,但不能指定 //主机/store/cust服务/request可以指定/store的路径/ (因为/store/includes/store/cust service/)但不是 /商店/客户服务/)。

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

        4
  •  0
  •   Stefan Rasmusson    14 年前

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

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

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

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

        5
  •  0
  •   user4981235 user4981235    7 年前

    null 而不是空字符串。换衣服 minIdCookie.setValue(""); minIdCookie.setValue(null);