Как удалить Cookie в сервлете Java

135

Как удалить куки в сервлете Java?

Я попробовал это: http://www.jguru.com/faq/view.jsp?EID=42225

РЕДАКТИРОВАТЬ: следующее теперь успешно работает, кажется, это сочетание:

response.setContentType("text/html");

и

cookie.setMaxAge(0);

Прежде чем я делал:

//remove single signon cookie if it hasn't been validated yet
response.setContentType("text/html");
Cookie cookie = new Cookie(SSORealm.SSO_COOKIE_NAME, "");
cookie.setDomain(SSORealm.SSO_DOMAIN);
cookie.setMaxAge(-1);
cookie.setPath("/");
cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis());
response.addCookie(cookie);

Который истекает cookie, когда браузер закрыт в соответствии с документацией .

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

Полный рабочий фрагмент файла cookie, срок действия которого истекает:

//remove single signon cookie if it hasn't been validated yet
response.setContentType("text/html");
Cookie cookie = new Cookie(SSORealm.SSO_COOKIE_NAME, "");
cookie.setDomain(SSORealm.SSO_DOMAIN);
cookie.setMaxAge(0);
cookie.setPath("/");
cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis());
response.addCookie(cookie);
Dougnukem
источник

Ответы:

138

Значение MaxAge -1 указывает, что файл cookie должен сохраняться в течение всего сеанса. Вы хотите установить MaxAge на 0 вместо этого.

Из документации API :

Отрицательное значение означает, что файл cookie не сохраняется постоянно и будет удален при выходе из веб-браузера. Нулевое значение приводит к удалению куки.
CJS
источник
9
Сначала я попытался установить setMaxAge (0) в Firefox, но я все еще видел его в моих файлах cookie как «Истекает: в конце сеанса» и думал, что мой сервлет все еще получает этот cookie с истекшим сроком действия. Возможно, это была комбинация необходимости установить response.setContentType ("text / html"); и setMaxAge (0); это заставило это наконец работать. Я попробовал это снова, и кажется, что cookie с setMaxAge (0) не будет отправляться в последующих запросах к моим Java-сервлетам.
Дугнукем
62

В моей среде работает следующий код. Хотя на первый взгляд выглядит избыточно, cookies[i].setValue("");и cookies[i].setPath("/");необходимо правильно очистить cookie.

private void eraseCookie(HttpServletRequest req, HttpServletResponse resp) {
    Cookie[] cookies = req.getCookies();
    if (cookies != null)
        for (Cookie cookie : cookies) {
            cookie.setValue("");
            cookie.setPath("/");
            cookie.setMaxAge(0);
            resp.addCookie(cookie);
        }
}
Ву Лян
источник
1
Кажется, это работает одинаково во всех браузерах.
2013 года
5
Я не уверен, что вы должны установить значение или путь файла cookie, потому что это может рассматриваться как другой файл cookie, верно? Чтобы очистить куки, вы должны установить максимальный возраст равным 0.
Серый
2
cookie.setPath (...) должен соответствовать любому пути, который использовался при создании файла cookie (то же самое для имени файла cookie и домена).
Маркус
12

Имейте в виду, что cookie на самом деле определяется набором его имени, пути и домена. Если какой-либо из этих трех элементов отличается или существует более одного файла cookie с одним и тем же именем, но с определенными путями / доменами, которые все еще могут быть видны для рассматриваемого URL-адреса, вы все равно увидите, что файл cookie передан по запросу. Например, если URL-адрес « http://foo.bar.com/baz/index.html », вы увидите все файлы cookie, определенные на bar.com или foo.bar.com, или с путем «/» или "/ Баз".

Таким образом, то, что у вас есть, должно работать, если в клиенте определен только один файл cookie с именем «SSO_COOKIE_NAME», доменом «SSO_DOMAIN» и путем «/». Если есть файлы cookie с другим путем или доменом, вы все равно увидите файл cookie, отправленный клиенту.

Чтобы отладить это, перейдите в настройки Firefox -> вкладка «Безопасность» и найдите все cookie с помощью SSO_COOKIE_NAME. Нажмите на каждый, чтобы увидеть домен и путь. Держу пари, вы найдете там не совсем то, что ожидаете.

broofa
источник
Хотя может также случиться так, что имя или путь не совпадают с именем файла cookie, который он просматривает в браузере (после того, как он фиксирует значение MaxAge), наличие или отсутствие других файлов cookie не имеет никакого отношения к состоянию, наличию или отсутствию конкретное печенье, которое он устанавливает.
cjs
8
Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) {
 cookies[i].setMaxAge(0);
}

разве это не сработало? Это удалит все куки, если ответ будет отправлен обратно.

aholbreich
источник
15
Не забудьте добавить измененный файл cookie обратно в ответ с помощью response.addCookie (cookies [i]);
Филип Басби
7

Это код, который я эффективно использовал раньше, передавая "/"в качестве параметра strPath.

public static Cookie eraseCookie(String strCookieName, String strPath) {
    Cookie cookie = new Cookie(strCookieName, "");
    cookie.setMaxAge(0);
    cookie.setPath(strPath);

    return cookie;
}
Кевин Хакансон
источник
0

Один особый случай: у куки нет пути.

В этом случае установите путь как cookie.setPath(request.getRequestURI())

Javascript устанавливает cookie без пути, поэтому браузер показывает его как cookie только для текущей страницы. Если я пытаюсь отправить просроченный файл cookie с path == /помощью браузера, отображаются два файла cookie: один с истекшим сроком действия, path == /а другой с path == current page.

UR6LAD
источник