Я пытаюсь удалить 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.
Я также пробовал добавить cookie в этот сервлет и в этот работает нормально.
Почему я не могу изменить свойства существующего файла cookie.
Проблема заключалась в том, что файл cookie, который я хотел удалить, имел путь «/ admin», а мой сервлет выхода имел путь «/ admin / logoutServlet». Когда я получаю файл cookie из запроса, путь устанавливается равным нулю. Поэтому, когда я добавляю файл cookie, в качестве моего сервлета устанавливается путь "/ admin /". Если я создал файл cookie с путем "/ admin /", сервлет смог его удалить.
Я решил проблему, явно указав путь к файлу cookie перед добавлением его в ответ.
minIdCookie.setMaxAge(0);
minIdCookie.setPath("/");
res.addCookie(minIdCookie);
Но я не понимаю, почему путь нулевой.
Не следует изменять путь. Это приведет к изменению идентификатора 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 в последующем новом запросе, а не в текущем.