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

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

6 ответов


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

с документация API:

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

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

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

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

чтобы отладить это, перейдите на вкладку настройки Firefox - > безопасность и найдите все файлы cookie с именем SSO_COOKIE_NAME. Нажмите на каждый, чтобы увидеть домен и путь. Держу пари, что ты ... найди там кого-нибудь, кто не совсем то, что ты ожидаешь.


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

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

    return cookie;
}

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

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


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

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

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