Java 서블릿에서 쿠키를 제거하는 방법


135

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

문서에 따라 브라우저가 닫히면 쿠키가 만료됩니다 .

음수 값은 쿠키가 지속적으로 저장되지 않으며 웹 브라우저가 종료 될 때 삭제됨을 의미합니다. 값이 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(0);
cookie.setPath("/");
cookie.setComment("EXPIRING COOKIE at " + System.currentTimeMillis());
response.addCookie(cookie);

답변:


138

-1의 MaxAge는 세션이 지속되는 동안 쿠키가 유지되기를 원한다는 신호입니다. MaxAge를 0으로 설정하려고합니다.

로부터 API 문서 :

음수 값은 쿠키가 지속적으로 저장되지 않으며 웹 브라우저가 종료 될 때 삭제됨을 의미합니다. 값이 0이면 쿠키가 삭제됩니다.

9
처음에는 firefox에서 setMaxAge (0)을 시도했지만 여전히 쿠키에 "만료 : 세션이 끝날 때"로 표시되는 것을보고 서블릿이 여전히 만료 된 쿠키를 받고 있다고 생각했습니다. response.setContentType ( "text / html");을 설정해야 할 수도 있습니다. 및 setMaxAge (0); 마침내 작동하게되었습니다. 다시 시도했는데 setMaxAge (0) 쿠키가 후속 요청에서 Java 서블릿으로 전송되지 않는 것으로 보입니다.
Dougnukem

62

내 환경에서 다음 코드가 작동합니다. 외모가 먼저 눈에 중복,하지만 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);
        }
}

1
이것은 모든 브라우저에서 일관되게 작동하는 것 같습니다.
ug_

5
쿠키의 값이나 경로를 다른 쿠키로 볼 수 있기 때문에 쿠키의 값이나 경로를 설정해야하는지 잘 모르겠습니다. 쿠키를 지우려면 최대 연령 만 0으로 설정해야합니다.
Grey

2
cookie.setPath (...)는 쿠키 생성시 사용한 경로 (쿠키 이름 및 도메인과 동일)와 일치해야합니다.
markus

12

쿠키는 실제로 이름, 경로 및 도메인의 튜플에 의해 정의됩니다. 이 세 가지 중 하나가 다르거 나 동일한 이름의 쿠키가 둘 이상 있지만 해당 URL에 여전히 표시 될 수있는 경로 / 도메인으로 정의 된 경우에도 쿠키가 요청에 전달 된 것을 볼 수 있습니다. 예를 들어, URL이 " http://foo.bar.com/baz/index.html "인 경우 bar.com 또는 foo.bar.com에 정의 된 쿠키 또는 "/"경로 또는 "/ baz".

따라서 이름이 "SSO_COOKIE_NAME", 도메인 "SSO_DOMAIN"및 경로 "/"인 클라이언트에 쿠키가 하나만 정의되어 있으면 작동하는 것처럼 보입니다. 경로 나 도메인이 다른 쿠키가있는 경우 여전히 쿠키가 클라이언트로 전송 된 것을 볼 수 있습니다.

이를 디버깅하려면 Firefox의 환경 설정-> 보안 탭으로 이동하여 SSO_COOKIE_NAME을 사용하여 모든 쿠키를 검색하십시오. 도메인과 경로를 보려면 각각을 클릭하십시오. 나는 당신이 거기에서 당신이 기대하는 것이 아닌 것을 찾을 것이라고 확신합니다.


이름이나 경로가 브라우저에서보고있는 쿠키의 이름이나 경로가 아닐 수도 있지만 (한 번 MaxAge 값을 수정하면) 다른 쿠키의 존재 여부는 상태, 존재 여부와 관련이 없습니다. 그가 설정 한 특정 쿠키.
cjs

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

작동하지 않습니까? 응답이 다시 전송되면 모든 쿠키가 제거됩니다.


15
response.addCookie (cookies [i]);를 사용하여 변경된 쿠키를 응답에 다시 추가하는 것을 잊지 마십시오.
Philihp Busby

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.setPath(request.getRequestURI())

자바 스크립트는 경로없이 쿠키를 설정하므로 브라우저는 현재 페이지의 쿠키로만 쿠키를 표시합니다. path == /브라우저 와 함께 만료 된 쿠키를 보내려고하면 하나의 쿠키가 만료 path == /되고 다른 쿠키는 쿠키가 표시 됩니다 path == current page.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.