web-dev-qa-db-ja.com

JavaサーブレットでCookieを削除するにはどうすればよいですか

JavaサーブレットのCookieを削除するにはどうすればよいですか?

私はこれを試しました: 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);

ドキュメント に従ってブラウザが閉じられたときにCookieを失効させます。

負の値は、Cookieが永続的に保存されず、Webブラウザーの終了時に削除されることを意味します。値がゼロの場合、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);
128
Dougnukem

-1のMaxAgeは、セッション中にCookieを保持することを示します。代わりにMaxAgeを0に設定します。

APIドキュメント から:

負の値は、Cookieが永続的に保存されず、Webブラウザーの終了時に削除されることを意味します。値がゼロの場合、Cookieは削除されます。
128
Curt J. Sampson

私の環境では、次のコードが機能します。一見冗長に見えますが、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);
        }
}
56
wu liang

Cookieは、実際には名前、パス、ドメインのタプルによって定義されることに注意してください。これらの3つのいずれかが異なる場合、または同じ名前の複数のCookieがあり、問題のURLに対してまだ表示されている可能性のあるパス/ドメインで定義されている場合、そのCookieはリクエストで渡されたままです。例えば。 urlが「 http://foo.bar.com/baz/index.html 」の場合、bar.comまたはfoo.bar.comで定義されたすべてのCookieが表示されます。 「/」または「/ baz」のパス。

したがって、クライアントに定義されているCookieが1つだけで、名前が「SSO_COOKIE_NAME」、ドメインが「SSO_DOMAIN」、パスが「/」である限り、動作するように見えます。パスまたはドメインが異なるCookieがある場合、クライアントに送信されたCookieが引き続き表示されます。

これをデバッグするには、Firefoxの設定->セキュリティタブに移動し、SSO_COOKIE_NAMEですべてのCookieを検索します。それぞれをクリックして、ドメインとパスを表示します。きっとあなたが期待しているものとは違うものが見つかると確信しています。

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

うまくいかなかった?これにより、応答が返送された場合、すべてのCookieが削除されます。

7
aholbreich

これは、"/"をstrPathパラメーターとして渡して、以前に効果的に使用したコードです。

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

    return cookie;
}
6
Kevin Hakanson

特別な場合:Cookieにはパスがありません。

この場合、パスをcookie.setPath(request.getRequestURI())に設定します

JavaScriptはパスなしでCookieを設定するため、ブラウザは現在のページのCookieとしてのみ表示します。 path == /で期限切れのCookieを送信しようとすると、ブラウザーには2つのCookieが表示されます。1つはpath == /で期限切れ、もう1つはpath == current pageで期限切れです。

0
UR6LAD