0

簡単な質問がありますが、もっと長い時間を探していますが、いつも同じ答えを見つけました。それをどう処理するかは本当にわかりません...

クライアントが私のアプリケーションに登録するときに、クライアントのIPアドレスを取得したい...

私はこのようなものを見つけました:

    @ManagedBean(name="testController")
    @SessionScoped
    public class TestController implements Serializable {

        private static final long serialVersionUID = -3244711761400747261L;
        protected final HttpServletRequest req;

        public TestController(HttpServletRequest req) {
            this.req = req;
            System.out.println(this.req.getRemoteAddr().toString());
        }
    }

しかし、コンストラクターにHttpServletRequestがありません...またはそれを使用する方法がわかりません。取得するのはエラーだけです...。

4

2 に答える 2

4

によって利用可能ですExternalContext#getRequest()

public TestController() {
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    System.out.println(request.getRemoteAddr());
}

最初の試行で 1 つの大きな概念上の誤りを犯していることに注意してください。現在の HTTP リクエストを、セッションスコープのマネージド Beanのプロパティとして割り当てようとしています。HTTP 要求インスタンスは、現在の HTTP 応答の終わりまでに期限切れになるため、有効ではなくなり、セッション スコープ Bean が作成されたときに最初の要求に続く後続の要求でそのメソッドにアクセスしようとすると、すべての色で例外がスローされます。

于 2012-03-22T21:42:29.577 に答える
1

Seam Solderプロジェクトでも使用されている別のアプローチを採用します。サーブレットリクエストをキャプチャし、アプリケーションスコープのプロデューサーを介して利用できるようにするサーブレットフィルターを作成します。はんだプロジェクトの対応するソースコードを参照してください。

于 2012-03-20T07:03:16.417 に答える