"私を覚えて"/"自動ログイン"機能を実装しようとしています。クライアントにクッキーを保存しましたが、いつ読むべきですか?たとえば、フィルタでそれを実行しようとすると、dbにアクセスするために使用するアプリケーションスコープのBeanにアクセスできなくなります。jsf 2.0の "remember me"機能
これを実行するベストプラクティスは何ですか?
"私を覚えて"/"自動ログイン"機能を実装しようとしています。クライアントにクッキーを保存しましたが、いつ読むべきですか?たとえば、フィルタでそれを実行しようとすると、dbにアクセスするために使用するアプリケーションスコープのBeanにアクセスできなくなります。jsf 2.0の "remember me"機能
これを実行するベストプラクティスは何ですか?
経由sessionScopeとのセッションを拡張します。それはコンテナのログインの後にカスタムのものがありますか(セッションにオブジェクトを入れるなど)か、カスタムだけですか?
最初のケースでは、JSFで自動ログインを行うことはできません。その理由は、用途が保護されたリソースにアクセスしようとするたびにコンテナがキックインするからです。その場合、コンテナログイン部をフィルタ(HttpServletRequest#login
)で実行する必要があります。
第1ケースと第2ケースの両方で、グローバルPhaseListener
を介してJSFパートを実行できます。この場合、非常に初期のイベントを聞くことができます。 before RESTORE_VIEW
。このイベントハンドラでは、あなたのログインにフラグを立てるためにそこに置かれたオブジェクトをセッションでチェックすることができ、そうでなければHttpServletRequest
を使用して「Remember me」クッキーがあるかどうかチェックし、必要に応じてログインを続行します。 PhaseListener
が呼び出されると、JSFは完全に機能し、アプリケーションスコープのマネージドBeanにアクセスできます。
セッションでオブジェクトを使用していて、コンテナのログインを気にしない場合は、最初の部分をスキップするだけです。
P.S.
もう一つの選択肢は、JSFマネージドBeanにDBを入れることではなく、DBにアクセスするためにJSFを操作する必要はありません。 Java EEアプリケーションでは、EJB Beanは代替候補です(実際にはこのジョブに適しています)。 JSFのライフサイクルが始まる前に、それらをフィルタに注入してDBにアクセスすることができます。 EJB Beansの隣には、CDI Beanもオプションです。とにかく、これらはJSF管理Beanのより良い選択肢です。
セッションスコープは、セッションがアクティブな間はコンテンツを保持し、DBまたはCookieを介して状態の永続性と結合します。
スコープの中には自分の状態を本当に "覚え"ているわけではありません。あなたができることはDBに状態を永続させ、ユーザーが戻ったらできるだけ元に戻し、セッションコピッドBean 。
そうでなければそれはあなたの現在のログインが正確にどのように機能するかに少し依存クッキー
FacesContext.getCurrentInstance().getExternalContext.addResponseCookie(..)
関連:http://stackoverflow.com/questions/5082846/java-ee-6-how-to-implement-stay-logged-in-when-user-login-in-to-the-web-applic – BalusC