3

JSF アプリケーションを開発しています。これは、許可されたユーザーのみを対象としています。

そのため、URL を介してページにアクセスしようとするときはいつでも、 Login にリダイレクトする必要があります。

フロントエンドとして XHTML を使用しています。そしてJSFフレームワークを使用しています。

そして、Login Bean を Session スコープに格納しています。

残念ながら、私はサーブレットと静的ページ「response.sendRedirect()」を使用しました。

前もって感謝します。

解決策の 1 つは、すべてのページを WEB-INF 内に配置することだと思いますが、問題の 1 つは、resonse.sendRedirect() を使用していて、facelets でテンプレートを使用していることです。

私に提案してください。


フォルダ内のマイ ログイン ページ

"/Common/Login.xhtml" そしていくつかのページ

"/Admin/*.xhtml"

そしていくつかのページ

`"Employee/*.ahtml"` 

管理者と従業員の 2 つのフォルダにフィルタを設定する方法

私はこのように与えましたが、フィルターサーブレットにエナリングしないように要求します

<filter-mapping>    
     <filter-name>LoginFilter</filter-name>   
      <url-pattern>/faces/Admin/*</url-pattern>    
     <url-pattern>/faces/Employee/*</url-pattern>           
<dispatcher>REQUEST</dispatcher>
       <dispatcher>FORWARD</dispatcher>  
   </filter-mapping>` 

私がこのように与えたら

 <url-pattern>/*</url-pattern>

無限ループに入りますこの問題の解決策を教えてください

4

2 に答える 2

6

私はこの問題を解決しました。マイフィルターマッピング

  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>

    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

と私のフィルタークラス

 public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {
    System.out.println("Entered intop Login Filter");
    HttpServletRequest req = (HttpServletRequest) request;
    LoginBean login = (LoginBean) req.getSession().getAttribute("login");
    String path = req.getRequestURI().substring(req.getContextPath().length());
    System.out.println("path:" + path);

    if (path.contains("/Admin/") || path.contains("/Employee/")) {
        if (login != null) {
            if (login.getUsername() != null && !login.getUsername().equals("")) {
                chain.doFilter(request, response);
            } else {
                HttpServletResponse res = (HttpServletResponse) response;
                res.sendRedirect("/EMS2/faces/Html/Common/Login.xhtml");
            }
        } else {
            HttpServletResponse res = (HttpServletResponse) response;
            res.sendRedirect("/EMS2/faces/Html/Common/Login.xhtml");
        }


    } else {
        chain.doFilter(request, response);
    }
}
于 2012-07-24T08:12:00.597 に答える
1

この同じ問題を処理するために私が決めた方法は、Spring および Spring Security 3 と統合された JSF2 を使用することです。これを適切に行う方法については、こちらの優れたチュートリアルとサンプル プロジェクトを参照してください。

http://technology-for-human.blogspot.com/2010/12/jsf-2-with-spring-3-basics-part-1-of-2.html

Spring をプロジェクトに統合したくない場合は、FacesServlet に到達する前に HTTP リクエストを承認または拒否するサーブレット フィルターを実装することをお勧めします。

  <filter>
    <filter-name>securityFilter</filter-name>
    <filter-class>org.company.filters.SecurityFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>securityFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
  </filter-mapping>

存在するすべての SessionScoped Bean は HttpSession の属性として検出できるため、この方法で SessionScoped マネージド Bean からログイン ユーザーを取得できます。

この時点では、承認は簡単です。ログインしたユーザーがこのページを表示してはならない場合は、ユーザーを許可されていないページにリダイレクトします。

于 2012-07-23T19:57:17.137 に答える