82

JSFアプリケーションでサーブレットフィルターを使用しています。アプリケーションに3つのグループのWebページがあり、サーブレットフィルタでこれらのページの認証を確認したいと思います。

私のフォルダ

/Admin/ *.xhtml

/Supervisor/*.xhtml
/Employee/*.xhtml

そして私は次のweb.xmlように書いています

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.ems.admin.servlet.LoginFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/Employee/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/Admin/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/Supervisor/*</url-pattern>
</filter-mapping>

しかし、のような要求

http://localhost:8080/EMS2/faces/Html/Admin/Upload.xhtml

フィルタに入っていません。

これらの3つのフォルダにセキュリティを提供する必要があります。

この問題を解決する方法は?

4

2 に答える 2

143

URLパターンがで始まる場合、/それはコンテキストルートを基準にしています。/Admin/*URLパターンは(コンテキストパスであると仮定して)上のページにのみ一致しhttp://localhost:8080/EMS2/Admin/*ます/EMS2が、実際にはhttp://localhost:8080/EMS2/faces/Html/Admin/*にあるため、URLパターンは一致しません。

/faces/HtmlURLパターンの前に次のようなプレフィックスを付ける必要があります。

<url-pattern>/faces/Html/Admin/*</url-pattern>

または、Webプロジェクトの構造/構成を再構成/faces/Htmlして、URLのパスを削除し、たとえばでページを開くこともできますhttp://localhost:8080/EMS2/Admin/Upload.xhtml

フィルタマッピング構文はすべて問題ありません。<filter-mapping>ただし、複数のURLパターンを指定する簡単な方法は、複数の<url-pattern>エントリを持つ1つだけを使用することです。

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/faces/Html/Employee/*</url-pattern>
    <url-pattern>/faces/Html/Admin/*</url-pattern>
    <url-pattern>/faces/Html/Supervisor/*</url-pattern>
</filter-mapping>
于 2012-08-04T15:41:06.993 に答える
21

フィルタ定義にアノテーションメソッドを使用している場合(で定義するのではなくweb.xml)、マッピングの配列を@WebFilterアノテーションに配置するだけでそれを行うことができます。

/**
 * Filter implementation class LoginFilter
 */
@WebFilter(urlPatterns = { "/faces/Html/Employee","/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginFilter implements Filter {
    ...

また、参考までに、これと同じことがサーブレットアノテーションを使用するサーブレットでも機能します。

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginServlet extends HttpServlet {
    ...
于 2014-09-17T19:59:41.363 に答える