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

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

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

EDIT: теперь это работает успешно, и это выглядит как комбинация:

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.

Полный рабочий фрагмент для истечения срока действия файла 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);

Ответ 1

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

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

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

Ответ 2

В моей среде работает следующий код. Хотя на первый взгляд выглядит излишним, 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);
        }
}

Ответ 3

Имейте в виду, что файл 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. Нажмите на каждый, чтобы увидеть домен и путь. Я готов поспорить, что вы найдете там, что не совсем то, что вы ожидаете.

Ответ 4

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

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

    return cookie;
}

Ответ 5

Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) {
 cookies[i].setMaxAge(0);
}

Неужели это не сработало? Это удаляет все файлы cookie, если ответ отправлен обратно.