1

JSF2 バッキング Bean (またはサーブレット) のカスタム Tomcat バルブによって設定された値を取得しようとしています。これを行う方法がわかりません。また、Google を使用した例も見つかりません。

背景: 私の JSF2 Web アプリでは、タイムゾーン属性を各ユーザーに追加する必要があります。これを実装する最も簡単な方法は、タイムゾーン ドロップダウンをユーザー プロファイル ページに追加して、各ユーザーが適切なタイムゾーンを選択できるようにすることです。ただし、これは自動化できる可能性があります。これは、ブラウザの JavaScript がタイムゾーンを自動的に計算できるためです。

そのため、この値を提供する Tomcat ログイン ページに新しいパラメーターを配置しました。この値は、Web アプリがログイン時に取得できます。Tomcat フォーム認証メカニズムは、(j_security_check への HTTP POST を介して) ログイン ページの処理を担当します。これをキャッチするために Java EE サーブレット フィルターを実装しましたが、Tomcat のログイン メカニズムはフィルターを回避するため、このコードは j_security_check への POST を認識しません。

Tomcat Valve を実装したので、j_security_check への POST を正常にキャッチできます。コードでは、タイムゾーンの値を抽出して配置します...どこに?

バルブ (TOMCAT_HOME/lib に配置する必要があります) には、通常の JSF2 コードとは異なるクラスローダーがあることを理解しています。これは、JSF2 コードからバルブの静的メンバーにアクセスできないことを意味します。

標準のTomcatバルブのソースコードに触発されて、バルブ内でこれを試しました:

final org.apache.catalina.Session session = request.getSessionInternal(true);
session.setNote("com.conexa.timezoneOffset", timezoneOffset);

しかし、私の JSF2 マネージド Bean では、org.apache.catalina.Session への参照を取得できません。

このコードは、org.apache.catalina.Session にアクセスできない StandardSessionFacade タイプのオブジェクトを返します。

FacesContext.getCurrentInstance().getExternalContext().getSession(false);

デバッグ モードで実行すると、org.apache.catalina.Session を見つけることができましたが、「メモ」フィールドは実際には空です。

また、Tomcat はログインに 1 つのセッションを使用し、その後新しいセッションを作成する可能性があると思います (おそらくSession Fixation Protectionに関連しています)。もしこれが本当なら、問題は複雑になると思います。

Tomcat の達人で、何か素晴らしいアイデアを持っている人はいますか? 単純なサーブレットのソリューションも受け入れられるでしょう。それを適応させることができると確信しているからです。

4

1 に答える 1

3

はい、わかった!

バルブコード:

final HttpSession session = request.getSession(true);
session.setAttribute("timezoneOffset", timezoneOffset);

JSF2 コードでは:

final ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
final String timezoneOffsetStr = "" + externalContext.getSessionMap().get("timezoneOffset");
于 2012-08-06T13:22:53.317 に答える