7

将来的にsetMaxAge()を使用してCookieを設定した場合、後続のリクエストでCookieをメモリに読み戻すと、getMaxAge()によって-1が返されます。Chromeの設定とインスペクターで実際のCookieを確認しましたが、実際に有効期限が60日後に設定されていることを確認できます。

static public void setHttpCookie(HttpServletResponse response, String payload) {
    Cookie c = new Cookie(COOKIE_NAME, payload);
    c.setMaxAge(60*86400); // expire sixty days in the future
    c.setPath("/"); // this cookie is good everywhere on the site
    response.addCookie(c);
}

static public String checkForCookie(HttpServletRequest req) {
    Cookie[] cookies = req.getCookies();
    if ( cookies != null ) {
        for ( Cookie c : cookies ) {
            if ( COOKIE_NAME.equals(c.getName()) ) {
                int maxAge = c.getMaxAge();
                logger.debug("Read back cookie and it had maxAge of {}.", maxAge);
                String payload = c.getValue();
                return payload;
            }
        }
    }
    return null;
}

c.getMaxAge()が常に-1を返すのはなぜですか?

4

1 に答える 1

15

ブラウザは、パスや経過時間などのCookie属性を送り返しません。名前と値のみを送り返します。最大有効期限が切れている場合、ブラウザはとにかくCookieを送信しません。パスがリクエストURIでカバーされていない場合、ブラウザはとにかくCookieを送信しません。

Cookieを設定した後で本当にCookieの経過時間を確認する必要がある場合は、ログインしたユーザーとCookie名に関連付けられたデータベーステーブルなど、Cookieを設定した時点で他の場所でCookieを覚えておく必要があります。 、 例えば。

この問題は、Java/サーブレットとは関係ありません。これがHTTPCookieの指定方法です。他のWebプログラミング言語でもまったく同じ問題が発生します。ウィキペディアからの次の抜粋も参照してください(私の強調)。

クッキー属性

名前と値のペアに加えて、サーバーは次のCookie属性を設定することもできます:Cookieドメイン、パス、有効期限または最大経過時間、セキュアフラグおよびHttpOnlyフラグ。ブラウザはCookie属性をサーバーに送り返しません。Cookieの名前と値のペアのみを送信します。Cookie属性は、Cookieを削除するタイミング、Cookieをブロックするタイミング、またはCookie(名前と値のペア)をサーバーに送信するかどうかを決定するためにブラウザーによって使用されます。

あなたがおそらくできる最善のことは、例えばログイン中に毎回クッキーの最大年齢を上げることです。これは、まったく同じCookie(特にまったく同じドメイン/パス/名前)をもう一度設定することで簡単に実現できます。既存のCookieを上書きします。これは通常、いわゆる「Rememberme」Cookieでそのように行われます。

于 2013-01-18T03:05:17.507 に答える