JavaサーブレットでCookieを削除する方法


135

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

回答:


138

MaxAgeが-1の場合は、セッションの期間中Cookieを存続させたいことを示します。代わりにMaxAgeを0に設定します。

APIドキュメントから:

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

9
最初はFirefoxでsetMaxAge(0)を試してみましたが、Cookieに「Expires:at session of end」と表示され、サーブレットが期限切れのcookieをまだ受信していると思いました。これは、response.setContentType( "text / html");を設定する必要がある組み合わせであった可能性があります。そしてsetMaxAge(0); それでようやく機能しました。もう一度試したところ、Javaサーブレットへの後続のリクエストでsetMaxAge(0)を含むCookieが送信されないようです。
Dougnukem 2009年

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_ 2013年

5
別のCookieとして表示される可能性があるため、Cookieの値またはパスを設定する必要があるかどうかはわかりません。クッキーをクリアするにはあなただけ0に最大エージングを設定する必要があります
グレー

2
cookie.setPath(...)は、Cookieが作成されたときに使用されたパスと一致する必要があります(Cookie名とドメインも同じ)。
マーカス2018

12

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

したがって、名前が「SSO_COOKIE_NAME」、ドメインが「SSO_DOMAIN」、パスが「/」のクライアントで定義されたCookieが1つしかない限り、問題なく動作するはずです。パスまたはドメインが異なるCookieがある場合でも、クライアントに送信されたCookieが表示されます。

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


名前またはパスが(MaxAge値を修正すると)ブラウザーで確認しているCookieの名前ではないこともありますが、他のCookieの有無は、状態、状態の有無とは関係ありません。彼が設定している特定のクッキー。
cjs 2009年

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

それはうまくいきませんでしたか?これにより、応答が返送された場合、すべてのCookieが削除されます。


15
変更したcookieをresponse.addCookie(cookies [i]);で応答に追加することを忘れないでください。
Philihp Busby 2012

7

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

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

    return cookie;
}

0

1つの特殊なケース:Cookieにパスがありません。

この場合、パスを cookie.setPath(request.getRequestURI())

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.