2009-07-03 16 views
1

URLを入力して特定のページにアクセスするのを防ぐためのフィルターを作成しました。私は3ページを持って、ユーザーはpage2またはpage3にのみpage1を介してアクセスするはずです。最初のページにはユーザ名を入力し、デンはpage2に移動する必要があります。私はマネージドBeanのユーザースコープのセッションを持っています。これは私のフィルタメソッドです。問題は、私はこの行(req.getAttribute( "user")== null)を私にnullを渡すことはないが、この[email protected]のような何かの値をユーザ名を入力していないということです。誰でも間違ってどこに私を修正するのに役立ちますか?JSFフィルターが特定のページに直接アクセスしないようにする

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse resp = (HttpServletResponse) response; 
    HttpSession httpSession = req.getSession(false); 
    String pageRequested = req.getRequestURI().toString(); 

    if (httpSession == null) { 
     httpSession = req.getSession(true); 
     resp.sendRedirect("Page1.faces"); 
    } else if (httpSession.getAttribute("user") != null 
      && ((User) httpSession.getAttribute("user")).getUsername() == null 
      && !pageRequested.contains("Page1.faces")) { 
     resp.sendRedirect("Page1.faces"); 
    } else { 
     chain.doFilter(request, response); 
    } 
} 

答えて

1

だから、ユーザーが正しくログインしていないときに特定のページにアクセスしたくないのですか?次に、ページアクセスをキャッチし、ログインページにリダイレクトするためのSpringセキュリティまたはJAASを調べる必要があります。代わりのセットとして、良いログインのためにセッションの属性を設定し、フィルタでそれを確認することができます。

0

次の試行の前に、ブラウザを閉じてセッション/ Cookieをクリアしてください。また、session.invalidate()となるログアウトボタンを作成することもできます。
春のセキュリティやJAASはあなたのための大きなオーバーヘッドかもしれないが、あなたは、JSFのPhaseListenerを使用することができ、代わりにフィルタの、例えば、RENDER_RESPONSE段階であなたのチェックを行います。

0

私はマネージドBeanのユーザースコープのセッションを持っています。

これはfaces-config.xmlで宣言されていますか?これはJSFのページで参照されていますか?

もしそうなら、JSFは自動的に1つを作成します。あなたはそれを傍受すべきではありません。宣言をfaces-config.xmlから削除するか、ログインしているユーザーを確認する方法を変更してください。

そうでない場合は、テスト方法が貧弱です。クライアント側で新しいセッションを取得するには、クライアントアプリケーションを再起動するか、サーバ側でHttpSession#invalidate()を実行します(私の意見では、あまりにも悲惨なことです)。セッションからuser属性を削除または無効にすれば十分です。

0

req.getRemoteUser()あなたを助けることができます。このリクエストを行ったユーザーのログイン情報を返します。あなたは(「顔」)

else if (req.getRemoteUser() != null && (pageRequested.contains(".faces") && !pageRequested.contains("Page1.faces"))) { 
      resp.sendError(403); 
+0

OPは、コンテナ管理の認証を使用していないようです例えばが、そのようなCSSはこのpageRequested.containsを追加するなど、他のリソースをフィルタリング防ぐために持っている自家製の認証、そう 'はgetRemoteUser( ) 'はOPの場合は何も返しません。 – BalusC

関連する問題