「remember me」/「autologin」機能を実装しようとしています。クライアントに Cookie を保存しましたが、いつ読み取る必要がありますか? たとえば、フィルターでこれを実行しようとすると、データベースへのアクセスに使用するアプリケーション スコープの Bean にアクセスできなくなります。
それを行うためのベストプラクティスは何ですか?
「remember me」/「autologin」機能を実装しようとしています。クライアントに Cookie を保存しましたが、いつ読み取る必要がありますか? たとえば、フィルターでこれを実行しようとすると、データベースへのアクセスに使用するアプリケーション スコープの Bean にアクセスできなくなります。
それを行うためのベストプラクティスは何ですか?
現在のログインが正確にどのように機能するかによって少し異なります。それはコンテナログインの後にカスタムのもの(セッションにオブジェクトを置くなど)ですか、それともカスタムのみですか?
最初のケースでは、ユーザーが保護されたリソースにアクセスしようとするたびにコンテナが起動するため、JSF で完全に自動ログインすることはできません。その場合でも、フィルター ( HttpServletRequest#login
) でコンテナーのログイン部分を実行する必要があります。
最初のケースと 2 番目のケースの両方で、JSF 部分は global を介して実行できますPhaseListener
。この場合、非常に初期のイベントを聞くことができますbefore RESTORE_VIEW
。このイベント ハンドラーでは、ログインにフラグを付けるためにそこに置かれたオブジェクトのセッションを確認できます。存在しない場合は、を使用しHttpServletRequest
て「remember me」Cookie があるかどうかを確認し、必要に応じてログインを続行します。がPhaseListener
呼び出されると、JSF が完全に機能し、アプリケーション スコープのマネージド Bean にアクセスできるようになります。
セッションでオブジェクトのみを使用し、コンテナーへのログインを気にしない場合は、最初の部分をスキップできます。
ps
もう 1 つのオプションは、JSF マネージド Bean に DB を一切配置しないことです。そのため、DB にアクセスするために JSF を操作する必要はありません。Java EE アプリケーションでは、EJB Bean が代替候補です (実際には、このジョブにより適しています)。それらをフィルターに注入して、JSF ライフサイクルが開始する前に DB にアクセスするために使用できます。EJB Bean の次に、CDI Bean もオプションです。とにかく、多くの点で、これらは JSF マネージド Bean のより優れた代替手段です。
セッションスコープは、セッションがアクティブである限りコンテンツを保持し、DBまたはCookieを介して状態の永続性と組み合わせます。
どのスコープもそれ自体で状態を実際に「記憶」することはありません。できる最善の方法は、状態をDBに保持し、ユーザーが戻ってきたら、可能な限り状態を復元して、データをセッションスコープのBeanにプッシュすることです。
それ以外の場合は、Cookieを介してセッションスコープのセッションを拡張します
FacesContext.getCurrentInstance().getExternalContext.addResponseCookie(..)