7

SessionListener からリクエストヘッダーにアクセスするにはどうすればよいですか?

現在のセッションの作成時にタイムアウトを設定する必要があります。タイムアウトは、HttpServletRequest のヘッダーに基づいて変更する必要があります。新しいセッションの作成と破棄をログに記録する SessionListener (HttpSessionListener を実装) が既にあり、タイムアウトを設定する最も論理的な場所のようです。

私は以下を試しましたが、常に ctx を null に設定します。

FacesContext ctx = FacesContext.getCurrentInstance();
4

3 に答える 3

10

HttpSessionListener、セッションの破棄を通知するために、要求が作成されていないときに呼び出されるため、要求にアクセスできません。

そのため、リクエストを調べてセッション タイムアウトを指定するには、FilterまたはServletを使用することをお勧めします。

于 2009-06-04T23:50:00.350 に答える
2
FacesContext ctx = FacesContext.getCurrentInstance();

JSFコンテキストは、リクエストごとおよびスレッドローカルです。したがって、このメソッド呼び出しは、JSFコントローラーの呼び出し(FacesServlet.serviceなど)の外部でnullを返す可能性があります。したがって、他のスレッドや、Facesサーブレットマッピングを通過しないリクエストはすべて返されます。

JSFメカニズムを使用してこのタイムアウトを設定することは技術的に可能です。フェーズリスナーを使用して、 RENDER RESPONSEの後にセッションをチェックできますが、タイムアウトを設定するにはサーブレットAPIにキャストする必要があります。フェーズリスナーの利点は、faces-config(仕様を参照)にグローバルに登録できること、または特定のビューに対して登録できることです。META-INF / faces-config.xmlを使用してJARで定義されたグローバルフェーズリスナーを複数のWARにドロップできるため、機能を簡単に再利用できます。

(セッションがJSFにプロビジョニングされる方法をオーバーライドすることもできますが、作業量が多すぎます。)

1回限りの場合、エリクソンによるフィルターの提案は非常に簡単です。

于 2009-06-05T10:49:37.770 に答える
1

できません ( API を参照してください)。このリクエストにより、セッションへのアクセスは許可されますが、その逆は許可されません。

同じセッションに対して同時リクエストがある可能性もあるため、これは現実的ではありません。

于 2009-06-04T23:22:41.573 に答える