在servlet中删除cookie的问题

时间:2010-08-12 09:24:26

标签: 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);
    minIdCookie.setValue("");
    minIdCookie.setPath("/");
    res.addCookie(minIdCookie);
}

res.flushBuffer();

但是这没有效果,也没有改变cookie属性。

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

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

5 个答案:

答案 0 :(得分:7)

您不应该更改路径。这会改变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,而不是在当前请求中。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:4)

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

  

public String getPath()public void setPath(String path)这些方法   获取或设置cookie适用的路径。如果你没有指定   在路径中,浏览器仅将cookie返回到其中或之下的URL   包含发送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 / includes / store / cust-service /)但不是路径   / store / cust-service / returns /(因为此目录不包含   /存储/ CUST-服务/).

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

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