Проблема удаления куки в сервлете - PullRequest
6 голосов
/ 12 августа 2010

Я пытаюсь удалить куки в сервлете с этим кодом

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.

Я также попытался добавить cookie в этот сервлет, и это прекрасно работает.

Почему я не могу изменить свойства существующего файла cookie.

Ответы [ 5 ]

7 голосов
/ 12 августа 2010

Вы не должны менять путь.Это изменило бы идентичность куки.Если для файла 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 в следующем новом запросе, а не в текущем.

4 голосов
/ 18 августа 2016

В большинстве случаев проблема связана с путем к 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.Указанный путь должен включать текущую страницу;то есть вы можете указать более общий путь, чем путь по умолчанию, но не более конкретный.Так, например, сервлет в / host / store / cust-service / request может указывать путь / store / (так как / store / включает в себя / store / cust-service /), но не путь / store / cust-service / return / (поскольку в этот каталог не входит /store/cust-service/).

, чтобы получить дополнительную информацию о свойствах пути и файла cookie, которые вы можете посетить здесь .

4 голосов
/ 22 августа 2013

Я понимаю, что это уже несколько лет, но ответ, который BalusC дал выше, не совсем корректен, и принятый ответ Стефана действительно не дает всех деталей.

Путь и домен всегда будут нулевыми при извлечении файлов cookie в Java, поскольку они необходимы только в ответе для браузера клиента. Однако, если вы находитесь в одном домене безопасности (независимо от пути), у вас все еще есть права на их удаление. К сожалению, поскольку путь не указан, вы не можете удалить cookie сейчас, не зная этого пути. Простое использование того же имени файла cookie, но другой путь не будет работать. Они считаются двумя разными файлами cookie, и вы обнаружите, что вместо удаления файла cookie вы просто создали другой файл по другому пути.

Другая проблема, с которой сталкиваются большинство разработчиков, заключается в том, что они пытаются проверить отсутствие файлов cookie, прежде чем ответ будет принят. Файл cookie не удаляется до тех пор, пока клиентский браузер не сможет прочитать ответ и удалить его из файловой системы. Если вы перейдете к другому сервлету с надеждой, что вы удалили куки, вы обнаружите, что он все еще существует (поскольку первоначальный запрос такой же). В этом смысле атрибуты запроса являются гораздо лучшим вариантом.

0 голосов
/ 09 мая 2017

Я думаю, что лучше использовать null вместо пустой строки. то есть. менять minIdCookie.setValue(""); до minIdCookie.setValue(null);

0 голосов
/ 12 августа 2010

Проблема заключалась в том, что файл cookie, который я хотел удалить, содержал путь «/ admin», а мой сервлет выхода имел путь «/ admin / logoutServlet».Когда я получаю cookie из запроса, путь устанавливается равным нулю.Поэтому, когда я добавляю cookie, путь устанавливается как "/ admin /" как мой сервлет. Если я создал cookie с путем "/ admin /", сервлет смог удалить его.

Я решил проблему, точно указав путь к файлу cookie, прежде чем добавить его в ответ.

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

Но я не понимаю, почему путь нулевой.

...