Java 删除servlet中的cookie时出现问题

Java 删除servlet中的cookie时出现问题,java,http,servlets,cookies,Java,Http,Servlets,Cookies,我试图用以下代码删除servlet中的cookie Cookie minIdCookie = null; for (Cookie c : req.getCookies()) { if (c.getName().equals("iPlanetDirectoryPro")) { minIdCookie = c; break; } } if (minIdCookie != null) { minIdCookie.setMaxAge(0);

我试图用以下代码删除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的属性。

您不应该更改路径。这将更改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;
        }
    }
}

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

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

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

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

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

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

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


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

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

public String getPath()public void setPath(字符串路径)这些方法 获取或设置应用cookie的路径。如果你没有具体说明 对于路径,浏览器仅将cookie返回到 包含发送cookie的页面的目录。例如,如果 服务器从发送cookie //ecommerce.site.com/toys/specials.html,浏览器将发送 连接到时将返回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/)但不是 /store/cust service/returns/(因为此目录不包括 /商店/客户服务/)


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

我认为最好使用
null
而不是空字符串。换衣服
minIdCookie.setValue(“”)
to
minIdCookie.setValue(空)

问题是我试图更改路径为“/admin”的cookie,而我的servlet路径为“/admin/”。无法删除另一路径或另一域上的cookie吗?您可以删除同一域的另一路径上的cookie。您只需将其最大值设置为0。你不应该改变路径。它只会创建一个新的cookie(因为maxage为0,所以cookie会立即消失)。您无法访问其他域上的Cookie。这是一个安全限制。您可以访问另一个子域的最高Cookie。您只需要将域设置为
.example.com
而不是
example.com
@BalusC。您可以建议我路径始终为空,因为它仅在响应中需要。当一个请求进来时,它是不需要的(或者他们声称是这样),因此没有设置。