2016-03-27 22 views
0

私は現在、JSFで「自動ログイン」メカニズムを実装しています。フィルタは、各リクエストをインターセプトし、ユーザがクッキーを読んでログインしているかどうかをチェックするように実装されています。CookieのmaxAgeは常に-1

すると、マネージドBeanに、クッキーはこのように保存され、ユーザが最初にログインする:

HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
Cookie cookie = new Cookie("myCookieRef", value); 
cookie.setPath("/"); 
cookie.setMaxAge(3600); 
response.addCookie(cookie); 

その後、ユーザがフィルタで、リダイレクトを実行する場合、私は取得するには、次のコードを使用しますクッキー:

Cookie[] cookies = request.getCookies(); 
if (cookies != null) 
{ 
    for (Cookie cookie : cookies) 
    { 
     if (name.equals("myCookieRef")) 
     { 
      return cookie; 
     } 
    } 
} 

リクエストはHttpServletRequestオブジェクトです。

問題が返されるクッキーが常に-1MAXAGEヌルを持っています。

クッキーを追加するときに何かが間に合わないかどうかわかりません。クッキーにいくつかの追加属性を指定する必要がありますか?

多くのありがとうございます。

答えて

2

クライアントは、名前と値以外のクッキー属性をサーバーに戻しません。

また、RFC6265 section 4.2.2(emphasis mine)も参照してください。

4.2.2。セマンティクス

各クッキーペアは、ユーザーエージェントによって保存されたクッキーを表します。 cookie-pairには、ユーザエージェント がSet-Cookieヘッダーで受け取ったcookie-nameとcookie-valueが含まれています。

クッキー属性はに返されません。具体的には、 クッキーが有効期限切れになるホスト、クッキーが有効なホスト、クッキーが有効なホスト パス、またはクッキーが セキュア属性またはHttpOnly属性で設定されているかどうかを確認することはできません。

最大経過時間が指定されたとおりに動作しています。さらに、クライアント側で期限切れになった場合、クッキー全体がクライアントからサーバーに送信されません。サーバー側では、通常、同じ名前/値の新しいCookieを設定し、Cookieが存在するかどうかにかかわらずログインしていないユーザーをチェックインするだけで、「自動ログイン」ごとにCookieの有効期間を延長します失効したかどうか。

他の理由で最大の年齢の値が本当に重要な場合は、一意のCookie識別子(Cookie値)とともに一部のデータベースに格納してください。

nullの値は、Cookieに含まれていない独自のコードの問題を示しています。この問題は、これまでに提供された情報には表示されませんが、チェック/デバッグすれば、簡単な間違いを発見できます。

「自動ログイン」の具体的な機能要件に関しては、これは参考になる可能性があります:How to implement "Stay Logged In" when user login in to the web application

+0

お返事ありがとうございます。私は別の質問があります:私は最初に "私を覚えている"というチェックをしてサインインし、サインアウトする前にサインアウトしてからクッキーを取り出し、HttpServletResponseでmaxAgeを0に設定します。その後、私は再び「サインイン」をチェックせずにサインインします。今回はフィルタで、初めてのサインイン時に作成された同じクッキーを引き続き検索できますが、クッキーがまだ存在する理由はわかりません。 クッキー名に関しては、それは常に同じものであるべきですか?異なるユーザーがログインしても?ユーザーが「私を覚えています」をチェックせずにログインした場合、クッキーを作成する必要がありますか? – qiuzmjq

+0

異なるパスに複数のCookieがあるようです。一般的なスターターの間違いは、Cookieパスが明示的に設定されていないため、URLに現在開かれているフォルダーがデフォルトであることです。明示的にクッキーパスを、このクッキーを使用可能にしたいすべてのフォルダーの共通の親に設定する必要があります。これがwebappのルートフォルダの場合は、 ''/''を設定します。 a.oを参照してください。 http://stackoverflow.com/a/28177426 – BalusC

+0

パスを「/」に設定しました。最初のログアウトを確認しているHttpServletResponseでmaxAgeを0に設定していても、2回目のログイン時にフィルタ内にクッキーが存在するのは奇妙です。 – qiuzmjq

関連する問題