2012-07-25 11 views
57

JSFアプリケーションでサーブレットフィルタを使用しています。 I自分のアプリケーション内のWebページの三つのグループを持っている、と私は私のサーブレットフィルタでこれらのページの認証をチェックしたい:サーブレットフィルタに複数のURLパターンを渡す

私のフォルダ

/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 

はFに入らないilter。

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

この問題を解決するにはどうすればよいですか?

答えて

100

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

あなたはとても/faces/Html同様のようで、あなたのURLパターンの前に付ける必要があります。

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

あなたはURLで/faces/Htmlパスを取り除くことができるようにあなたが代わりにもちょうどあなたのWebプロジェクト構造/コンフィギュレーションを再構成することができますたとえば、http://localhost:8080/EMS2/Admin/Upload.xhtmlのようにページを開くことができます。

フィルタマッピングの構文はすべて問題ありません。あなたは(web.xmlでそれらを定義するとは対照的に)サーブレット定義のための注釈方法を使用している場合は

<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> 
+4

は、私の知る限りは、複数のurl-pattern要素を見ることができるように許可されていませんし、期待どおりに動作しません。 –

+14

@SebastianG:あなたの具体的な問題は他の場所で発生しています。サーブレット2.5(ほぼ7年前にリリースされたJava EE 5の一部)には、複数の「」要素のサポートが導入されていることに注意してください。先史時代の獣に取り組んでいるのかもしれません。あるいは、あなたのコンテナがサーブレット2.4以前のバージョンと一致するフォールバック・モードで動作するような重大な設定上の問題があります。 – BalusC

+14

複数の ''は、同じリソース(例えば、 '/ * 'を使うものと' url-pattern'として '/ foo.xhtml'を使うもの)とが一致すれば、同じフィルタを2回実行します。 JBoss AS 7.1でこの動作が発生しました。 – Paranaix

11

:しかし、複数のURLパターンを指定するための簡単な方法は、単に複数で<url-pattern>エントリを一つだけ<filter-mapping>を使用することです、あなただけの@WebServlet注釈にサーブレットマッピングの配列を置くことによってそれを行うことができます。

/** 
* Servlet implementation class LoginFilter 
*/ 
@WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"}) 
public class LoginFilter extends HttpServlet { 
    ... 
+7

例だけであっても、 'HttpServlet'の代わりに' Filter'を拡張する方が良いわけではありません? – alexander

+0

異なるサーブレットURLパターンに対してフィルタを実行できます。フィルタをサーブレットに置き換えることはできません。 –

+0

彼はフィルタ動作を望み、サーブレット動作は望んでいません。彼はすでにそれらのURLをサーブレットにマップしていると思います。 –