2016-04-28 7 views
0

私はクッキーを使用して、重要でないデータをセッション間で共有しています。私はいくつかのlastUsedEntity(文字列リテラル)を現在のセッションからユーザログアウトイベントで保存して、そのエンティティを次のログインセッションで読み込み/使用できるようにします。そのエンティティは私のアプリケーションのセッションBeanに属します。次のセッションで古いセッションから保存されたデータを使用する方法は?

このエンティティを抽出し、セッションBeanの@PreDestroyメソッドに格納することにしました。このメソッドは、アプリケーションのセッションタイムアウト時に正常に実行されました。しかし、@PreDestroyメソッドでFacesContext.getCurrentInstance()がヌルであったため、Cookieの保存に失敗しました。これはJSFライフサイクルのリクエスト - 応答サイクルが完了したためです。私はFacesContext.getCurrentInstance()@PostContructのセッションBeanのメソッドにキャッシュしようとしましたが、フェースコンテキストのキャッシュされたインスタンスにアクセスできましたが、別の問題に直面しましたjava.lang.IllegalStateException at com.sun.faces.context.FacesContextImpl.assertNotReleased FacesContextをセッションスコープのクラスのインスタンス変数として使用したためです。このシナリオでさらに使用するために私の古いセッションデータを保持するために、私がここで何か頭を上げるか、または他のより良いアイデアを得ることができれば幸いです。

答えて

3

HTTPセッションがエンドユーザの非アクティブなためにサーバ側で期限切れになった場合、必ずしもHTTPリクエストの手段であるとは限りません。 HTTP要求を送信できるのはエンドユーザーだけです。 FacesServletを呼び出すHTTPリクエストがない場合は、FacesContextもありません。あなたがクッキーを返すことができるHTTPレスポンスはもちろんです。

ロジックを再考する方がよいでしょう。例えば。必要に応じて特定のパスやCookie値のタイムスタンプで前の値を上書きして、要求ごとにすぐにクッキーを設定します。具体的な機能要件によっては、エンドユーザーがクッキーを完全に操作できるようになり、重要なビジネスロジックに絶対に依存しないようにすることができます。それが純粋にプレゼンテーションの場合、それは大丈夫でなければなりません。それ以外の場合は、ログインしたユーザーに関連付けられたデータベースに保存してください。

+0

以前は、各ページの読み込み(またはリクエスト)でCookieを設定すると言っていました。私は複数ページのアプリケーションで作業しています。独自のIDを持つ各ページ。ログアウト時にページがログインページにリダイレクトされます。私はそれぞれの 'ViewScoped'ページに上陸すると、' PostConstruct'メソッドで 'lastOpenedId'という名前のキーでクッキーを設定しています。このIDは、セッションスコープのサービスBeanに由来します。しかし、私の実際の要件は 'lastExpiredId'を格納する代わりにセッションのタイムアウトのためにログアウトしたページのIDを追跡する必要があるためです。 – user2918640

+1

DBに格納します。 – BalusC

+0

これは、Webフレームワークレベルで実行できるものを考え出すことができない限り、私が最後の手段として考えてきたことです。 – user2918640

関連する問題