Як видалити файл cookie з сервлету Java


135

Як видалити файл 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);

Відповіді:


138

MaxAge -1 сигналізує про те, що ви бажаєте, щоб файл cookie зберігався протягом сеансу. Замість цього потрібно встановити MaxAge на 0.

З документації API :

Від’ємне значення означає, що файл cookie не зберігається постійно і буде видалено, коли веб-браузер закриється. Нульове значення призводить до видалення файлу cookie.

9
Я спробував setMaxAge (0) спочатку в firefox, але я все ще бачив, що в моїх файлах cookie є "Закінчується: в кінці сеансу", і думав, що мій сервлет все ще отримує печиво, що минув. Можливо, це було поєднанням необхідності встановити response.setContentType ("текст / 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
Здається, це працює в усіх браузерах.
ug_

5
Я не впевнений, що вам слід встановити значення або шлях файлу cookie, оскільки це може розглядатися як інший файл 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, або зі шляху "/" або "/ баз".

Таким чином, те, що у вас є, схоже, має працювати, доки в клієнті визначено лише одне печиво з назвою "SSO_COOKIE_NAME", домен "SSO_DOMAIN" та шлях "/". Якщо є файли cookie з іншим шляхом або доменом, ви все одно побачите файли cookie, надіслані клієнту.

Щоб налагодити це, перейдіть на вподобання Firefox -> вкладку Безпека та знайдіть усі файли cookie за допомогою SSO_COOKIE_NAME. Клацніть на кожному, щоб побачити домен та шлях. Б'юсь об заклад, що ви знайдете там, що не зовсім те, чого ви очікуєте.


Хоча може також бути, що ім'я або шлях не є файлом cookie, який він переглядає у браузері (як тільки він фіксує значення MaxAge), наявність або відсутність інших файлів cookie не має нічого спільного зі станом, наявністю або відсутністю певне печиво, яке він встановлює.
cjs

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

це не працювало? Це видаляє всі файли cookie, якщо відповідь надсилається назад.


15
Не забудьте додати змінений файл cookie до відповіді з answer.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 немає шляху.

У цьому випадку встановіть шлях як cookie.setPath(request.getRequestURI())

Javascript встановлює файл cookie без шляху, тому браузер показує його як cookie лише для поточної сторінки. Якщо я спробую надіслати файл cookie з минулим терміном за path == /допомогою браузера, відображаються два файли cookie: одне закінчилось, path == /а інше - з path == current page.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.