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つのフォルダーにセキュリティを提供する必要があります。
この問題を解決するには?
URLパターンが/
で始まる場合、コンテキストルートに相対的です。 /Admin/*
URLパターンはhttp://localhost:8080/EMS2/Admin/*
上のページにのみ一致します(/EMS2
がコンテキストパスであると仮定)、実際にhttp://localhost:8080/EMS2/faces/Html/Admin/*
にあるため、URLパターンは一致しません。
次のように、URLパターンの前に/faces/Html
を付ける必要があります。
<url-pattern>/faces/Html/Admin/*</url-pattern>
または、URLの/faces/Html
パスを削除して、たとえばhttp://localhost:8080/EMS2/Admin/Upload.xhtml
でページを開くことができるように、Webプロジェクトの構造/構成を再構成することもできます。
フィルタマッピング構文はすべて問題ありません。ただし、複数のURLパターンを指定するより簡単な方法は、複数の<filter-mapping>
エントリで<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>
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 {
...