Como você remove um cookie em um servlet Java

135

Como você remove um cookie em um servlet Java?

Eu tentei isso: http://www.jguru.com/faq/view.jsp?EID=42225

EDIT: O seguinte agora funciona com sucesso, parece ser a combinação de:

response.setContentType("text/html");

e

cookie.setMaxAge(0);

Antes de eu fazer:

//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);

Que expira o cookie quando o navegador é fechado conforme a documentação .

Um valor negativo significa que o cookie não é armazenado persistentemente e será excluído quando o navegador da Web sair. Um valor zero faz com que o cookie seja excluído.

O snippet de trabalho completo para expirar um 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
fonte

Respostas:

138

O MaxAge de -1 indica que você deseja que o cookie persista durante a sessão. Você deseja definir MaxAge como 0.

Na documentação da API :

Um valor negativo significa que o cookie não é armazenado persistentemente e será excluído quando o navegador da Web sair. Um valor zero faz com que o cookie seja excluído.
cjs
fonte
9
Tentei o setMaxAge (0) inicialmente no firefox, mas ainda o vi listado nos meus cookies como "Expira: no final da sessão" e pensei que meu servlet ainda estivesse recebendo esse cookie expirado. Pode ter sido uma combinação de precisar definir o response.setContentType ("text / html"); e setMaxAge (0); que finalmente deu certo. Tentei novamente e parece que o cookie com setMaxAge (0) não será enviado em solicitações subsequentes aos meus servlets Java.
Dougnukem 21/05/2009
62

No meu ambiente, o código a seguir funciona. Embora pareça redundante à primeira vista, cookies[i].setValue("");e cookies[i].setPath("/");são necessários para limpar o cookie corretamente.

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);
        }
}
wu liang
fonte
1
Isso parece funcionar de forma consistente em todos os navegadores.
ug_
5
Não sei se você deve definir o valor ou o caminho do cookie, porque isso pode ser visto como um cookie diferente, certo? Para limpar um cookie você só deve definir o máximo de idade para ser 0.
Grey
2
cookie.setPath (...) precisa corresponder a qualquer caminho usado quando o cookie foi criado (o mesmo para nome e domínio do cookie).
Markus
12

Lembre-se de que um cookie é realmente definido pela tupla de seu nome, caminho e domínio. Se qualquer um desses três for diferente ou se houver mais de um cookie com o mesmo nome, mas definido com caminhos / domínios que ainda possam estar visíveis para o URL em questão, você ainda verá que o cookie foi passado na solicitação. Por exemplo, se o URL for " http://foo.bar.com/baz/index.html ", você verá quaisquer cookies definidos em bar.com ou foo.bar.com, ou com o caminho "/" ou "/ baz".

Portanto, o que você parece deve funcionar, desde que haja apenas um cookie definido no cliente, com o nome "SSO_COOKIE_NAME", domínio "SSO_DOMAIN" e caminho "/". Se houver cookies com caminho ou domínio diferente, você ainda verá o cookie enviado ao cliente.

Para depurar isso, acesse as preferências do Firefox -> guia Segurança e procure todos os cookies com o SSO_COOKIE_NAME. Clique em cada um para ver o domínio e o caminho. Aposto que você encontrará um que não é exatamente o que você está esperando.

broofa
fonte
Embora também possa ser que o nome ou caminho não seja o do cookie que ele está visualizando no navegador (depois de fixar o valor MaxAge), a presença ou ausência de outros cookies não tem nada a ver com o estado, presença ou ausência de cookie. o cookie em particular que ele está colocando.
Cjs
8
Cookie[] cookies = request.getCookies();
if(cookies!=null)
for (int i = 0; i < cookies.length; i++) {
 cookies[i].setMaxAge(0);
}

isso não funcionou? Isso remove todos os cookies se a resposta for enviada de volta.

aholbreich
fonte
15
Não se esqueça de adicionar o cookie alterado de volta à resposta com response.addCookie (cookies [i]);
Philihp Busby
7

Este é o código que eu efetivamente usei antes, passando "/"como o parâmetro strPath.

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

    return cookie;
}
Kevin Hakanson
fonte
0

Um caso especial: um cookie não tem caminho.

Nesse caso, defina o caminho como cookie.setPath(request.getRequestURI())

O javascript define o cookie sem o caminho para que o navegador o mostre como cookie apenas para a página atual. Se eu tentar enviar o cookie expirado com path == /o navegador, mostramos dois cookies: um expirado com path == /e outro com path == current page.

UR6LAD
fonte