2009-06-04 9 views
6

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

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

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

FacesContext ctx = FacesContext.getCurrentInstance(); 

答えて

8

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

したがって、FilterまたはServletは、要求を調べてセッションタイムアウトを指定する方がよいでしょう。

1

the APIを参照)できません。要求によってセッションにアクセスできるようになりますが、それ以外の方法ではアクセスできません。

同じセッションに対して同時にリクエストをしている場合もあるので、これは実現できません。

+3

"同じセッションに対して同時にリクエストがあっても実行できない可能性があります。"私は同意しない! 1つのリクエストでのみ、「sessionCreated」が起動されたセッションが作成されます。これは仕様の見落としです... "sessionCreated"メソッドの場合、セッションを作成したリクエストを見つけることができます! –

2
FacesContext ctx = FacesContext.getCurrentInstance(); 

JSFコンテキストは、要求ごとおよびスレッドローカルです。したがって、このメソッド呼び出しはおそらく、JSFコントローラの呼び出し(たとえば、FacesServlet.service)の外側でnullを返します。つまり、Facesサーブレットマッピングを通過しない他のスレッドやリクエスト。

JSFのメカニズムを使用して、このタイムアウトを設定することは技術的には可能である - あなたはまだタイムアウトを設定するcast to the servlet APIしなければならないのに、あなたが、RENDER RESPONSE後にセッションをチェックするためにphase listenerを使用することができます。フェーズリスナーの利点は、faces-config(see spec)またはfor specific viewsにグローバルに登録できることです。 META-INF/faces-config.xmlを持つJARで定義されたグローバルフェーズリスナーを複数のWARにドロップすると、その機能を簡単に再利用できます。

(あなたがoverride how the session is provisioned to JSFもできたが、仕事の量が過剰である。)

1オフの場合、Filtererickson's suggestionは本当に簡単です。

関連する問題