删除servlet中的cookie的问题

我尝试使用此代码删除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身份。 如果为/foo这样的路径设置了cookie并将其更改为/ ,则客户端将不再将更改的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,而不是在当前请求中。

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

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

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

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

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

要获得更多关于路径和cookie相关属性的信息,请访问此处 。

问题是我想要删除的cookie有一个“/ admin”路径,我的logout servlet有路径“/ admin / logoutServlet”。 当我从请求中获取cookie时,路径被设置为null。 因此,当我添加cookie时,路径设置为“/ admin /”作为我的servletIf我创建了一个带有路径“/ admin /”的cookie,servlet能够将其删除。

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

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

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

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