web-dev-qa-db-ja.com

Servlet Filterに複数のURLパターンを与える

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つのフォルダーにセキュリティを提供する必要があります。

この問題を解決するには?

69
Raju Boddupalli

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>
122
BalusC

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 {
    ...
15
Michael Plautz