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