在servlet中删除cookie的问题

6

我正在尝试使用以下代码在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个回答

7

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


问题在于我试图更改一个路径为“/admin”的cookie,而我的servlet路径是“/admin/”。是否不可能在另一个路径或另一个域上删除cookie? - Stefan Rasmusson
您可以在同一域的另一个路径上删除cookie。您只需要将其最大年龄设置为0即可。您不应更改路径。这只会创建一个新的cookie(反过来会立即消失,因为maxage为0)。您无法访问另一个域上的cookie。这是一项安全限制。您最多只能访问另一个子域的cookie。您只需要将域设置为.example.com而不是example.com即可。 - BalusC
@BalusC,你能给我建议吗?https://stackoverflow.com/questions/49975485/cookie-is-adding-twice-in-browser-when-page-is-loaded - srinivas gowda

4
大多数情况下问题出在cookie的路径上。 因此,在创建cookie时要注意指定路径。 然后在丢弃cookie时使用相同的路径。 路径的概念是:
这些方法用于获取或设置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/包括/store/cust-service/),但不能指定路径为/store/cust-service/returns/(因为此目录不包括/store/cust-service/)。

如果您想了解有关路径和cookie相关属性的更多信息,可以访问此处


4

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

在Java中检索cookie时,路径和域名将始终为null,因为它们仅对客户端浏览器的响应是必要的。然而,如果您在同一个安全域中(无论路径如何),您仍然有权删除它们。不幸的是,因为路径未包含在内,您现在无法删除cookie,除非明确知道该路径。仅仅使用相同的cookie名称,但不同的路径是行不通的。它们被认为是两个不同的cookie,您会发现,与其删除cookie,您只是在不同的路径上创建了另一个cookie。

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


0
问题是我想要删除的cookie路径是“/admin”,而我的注销servlet路径是“/admin/logoutServlet”。当我从请求中获取cookie时,路径被设置为null。所以当我添加cookie时,路径被设置为“/admin/”作为我的servlet,如果我创建了一个路径为“/admin/”的cookie,servlet就可以将其删除。
我通过在将cookie添加到响应之前明确设置cookie的路径来解决了这个问题。
minIdCookie.setMaxAge(0);
minIdCookie.setPath("/");
res.addCookie(minIdCookie);

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


路径始终为空,因为它只在响应中需要。当请求到来时,它不是必需的(或者他们声称不需要),因此没有设置。 - OnResolve

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接