0

Websphereアプリケーションサーバー8でjsf2.0を使用しています。

ユーザーを承認するリクエストフィルターがあります。ユーザーは、WebSEALに対して自分自身を認証します。ユーザーロールはMySQLDBに保存されます。My Requestfilterは、リクエストごとにhttpServletRequestからユーザープリンシパルを取得します。次に、ユーザーが(DB内で)どの役割を持っているかを調べます。

リクエストごとにDBクエリがあるため、これは非常に貧弱です。

これを改善するために、ユーザー名とロールを含むSessionBeanを実装したいと思います。私の問題は、requestfilterからsessionbeanを取得できないことです。filterclassのmanagespropertyとしてsessionbeanを使用しようとしました。

しかし、sessionbeanが以前に呼び出されることはないため、常にNullpointerexceptionが発生します。

では、どうすればこれを行うことができますか?これは間違った方法ですか?

4

2 に答える 2

1

JSFは@SessionScoped @ManagedBean、の属性としてsを格納しますHttpSession。したがって、Filterそれらの内部では次のように利用できます。

HttpSession session = ((HttpServletRequest) request).getSession();
SessionBean sessionBean = (SessionBean) session.getAttribute("sessionBean");

ただし、スコープにまだ存在しない場合、このアプローチではBeanが自動作成されないことを考慮する必要があります。これは、新しいHTTPセッションでフィルターが初めて呼び出された場合に当てはまります。Filtlerつまり、はのに呼び出されますFacesServlet次に、セッションBeanを自分で作成する必要があります。

HttpSession session = ((HttpServletRequest) request).getSession();
SessionBean sessionBean = (SessionBean) session.getAttribute("sessionBean");

if (sessionBean == null) {
    sessionBean = new SessionBean();
    session.setAttribute("sessionBean", sessionBean);
}

// ...

sessionBean.setRole(role);

// ...

JSFは、セッションスコープにすでに存在する場合は常に新しいインスタンスでオーバーライドしませんが、で作成されたものとまったく同じインスタンスを再利用しますFilter

于 2012-06-04T16:08:37.440 に答える
0

私の同様の答えを参照してください、あなたはこの方法であなたのSessionBeanを得ることができるはずです

編集

または、このアプローチを試すことができます

 HttpSession session = (req (HttpServletRequest)).getSession();
 MyManagedBean myManagedBean = session.getAttribute("myManagedBean");`

または、フィルターの代わりにPhaseListenerを使用することもできます。アプリを保護するためのPhaseListenerの使用に関するこの素晴らしい記事を参照してください。

于 2012-06-04T11:26:10.907 に答える