Как удалить Cookie в сервлете Java - PullRequest
127 голосов
/ 21 мая 2009

Как удалить куки в сервлете 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);

Ответы [ 6 ]

126 голосов
/ 21 мая 2009

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

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

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

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

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);
        }
}
12 голосов
/ 21 мая 2009

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

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

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

7 голосов
/ 12 ноября 2010
Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) {
 cookies[i].setMaxAge(0);
}

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

6 голосов
/ 21 мая 2009

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

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

    return cookie;
}
0 голосов
/ 14 мая 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...