6

サーブレットから生成されたCookieがあり、永続的にしたいと考えています。つまり、Cookieを設定し、IEを閉じて、バックアップを開始しても、Cookieを読み取ることができます。私が使用しているコードは次のとおりです。

HttpServletResponse response = 
    (HttpServletResponse) FacesContext.getCurrentInstance()
    .getExternalContext().getResponse();

Cookie cookie = new Cookie("someKey", "someValue");
cookie.setMaxAge(7 * 24 * 60 * 60);
response.addCookie(cookie);

これはFirefoxでうまく機能しますが、IE 6/7では、ブラウザの再起動の間にCookieが保存されません。設定で考えられることをすべて確認しましたが、Cookieが削除される原因を特定できません。私の知る限り、正の数でsetMaxAgeを呼び出すと、Cookieが永続的になります。なぜこれがうまくいかないのか、何か考えはありますか?

編集

Olafが提案した詳細情報のトリックを使用して、Cookieが永続的なCookieではなくセッションCookieとして設定されようとしていることを確認しました。最大年齢は「セッションの終了」に設定されます。そのため、IEの最大年齢が設定されているようには見えません-Firefoxで最大年齢が正しく設定されていることを確認しました。何が起こっているのかまだわかりません。

4

6 に答える 6

6

私はJavaやサーブレットについて何も知りませんが、IEは有効期限がある場合にのみCookieを保持します.max-ageを設定するだけでは十分ではありません.IEは引き続きセッションCookieとして扱います.

于 2009-07-27T16:39:14.293 に答える
1

いくつかの提案。

  1. fqdn を使用してサイトにアクセスしていますか?
  2. フィドラーを使用して、http 応答で Cookie がどのように見えるかを確認します。
  3. インターネット上の他のサイトが Cookie を正常に保存しているかどうかを確認します。
于 2008-12-11T23:20:03.620 に答える
1

このhttp://www.mail-archive.com/users@tomcat.apache.org/msg52249.htmlには答えがありますが、その理由は実際には説明されていません。

つまり、@ (バージョン 0 Cookie では受け入れられない文字) をエンコードすることにより、応答で送信される Cookie のバージョンが 1 (別の形式であり、IE で受け入れられない) ではなく 0 (IE で受け入れ可能) に設定されます。

私の問題は同じようなものでした。Cookie の値を Base64 でエンコードして送信していました。ただし、Base64 には '=' などの文字が含まれています ... これもバージョン 0 では違法であり、IE では受け入れられません。

私に残っている謎は次のとおりです。スタックの一部は、Cookie の値がバージョン 0 の Cookie として無効であることを認識するのに十分「スマート」であり、応答をバージョン 1 の Cookie (明示的なバージョン番号、 「受け入れられない」文字、expires フィールドではなく max-age など)、バージョンを反転する決定を下すのが Tomcat、Faces、Spring、または javax.servlet であるかどうかはわかりません。

結論: Cookie の値の URI エンコーディングにより、ブラウザーに設定された Cookie がバージョン 0 であり、IE によって保持されることが保証されます。

于 2009-12-10T14:38:32.620 に答える
0

IE8でも同様の問題がありましたが、httpを使用している場合はCookieが保持されていましたが、httpsを使用している場合は保持されませんでした。Intellectual Tortoise のソリューションは、「=」やその他の文字が含まれていたため、うまくいきました。https Cookie をエンコードする前は、「セッションの終了」で期限切れと表示されていました。値をエンコードした後、渡した maxAge で期限切れになりました。設定前と取得後に Cookie 値をエンコード/デコードするために使用したメソッドは次のとおりです。

public static String encodeString(String s) {
    String encodedString = s;

    try{
        encodedString = URLEncoder.encode(s, "UTF-8");
    } catch (UnsupportedEncodingException e) {}

    return encodedString;
}
public static String decodeString(String s) {
    String decodedString = s;

    try{
        decodedString = URLDecoder.decode(s, "UTF-8");
    } catch (UnsupportedEncodingException e) {}

    return decodedString;
}
于 2010-11-15T17:34:15.770 に答える
0

私はウィンドウを使用していないので、これはかすかな記憶です: Cookie が設定されるたびに「許可を求める」ように IE Cookie 設定を設定すると、Cookie が有効であるはずの期間が表示されませんか? また、完全に異なる設定を取得して再試行するために、サイトを別のセキュリティ ゾーン (ローカルまたは呼び出されたもの) に追加することもできます。

お役に立てれば...

于 2008-12-14T10:52:17.877 に答える