2012-07-25 59 views
57

我在JSF應用程序中使用了Servlet篩選器。我有三組的網頁在我的申請,我要檢查驗證這些網頁在我的Servlet過濾器:爲Servlet篩選器提供多個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/*網址格式只會匹配http://localhost:8080/EMS2/Admin/*(假設/EMS2是上下文路徑)的網頁,但實際上您的網址格式爲http://localhost:8080/EMS2/faces/Html/Admin/*,因此您的網址格式永遠不會匹配。

您需要前綴/faces/Html您的網址模式,以及像這樣:

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

您也可以也只是重新配置你的Web項目的結構/配置,讓您可以在網址擺脫/faces/Html路徑以便您可以通過例如http://localhost:8080/EMS2/Admin/Upload.xhtml打開頁面。

您的過濾器映射語法都很好。然而,指定多個URL模式更簡單的方法只有一個<filter-mapping>只使用多個<url-pattern>條目:

<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的元素不允許的,不能按預期工作。 – 2013-03-01 12:21:37

+14

@SebastianG:你的具體問題是其他地方引起的。請注意,在Servlet 2.5中引入了對多個''元素的支持(幾乎7年前發佈的Java EE 5的一部分)。也許你正在研究一個史前的野獸,或者你有嚴重的配置問題,導致你的容器運行在一個與Servlet 2.4或更舊版本匹配的備用模式下,從而失去了所有的Servlet 2.5特性。 – BalusC 2013-03-01 12:37:09

+14

注意,如果多個''匹配相同的資源,例如一個使用'/ *',另一個使用'/ foo.xhtml'作爲'url-pattern',則會執行相同的過濾器兩次。我在JBoss AS 7.1上遇到過這種情況。 – Paranaix 2013-04-05 12:28:41

11

如果您正在使用servlet定義的標註方法(而不是在web.xml定義它們) ,你可以只把servlet映射的一個數組中的@WebServlet註釋這樣做:

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

擴展一個'Filter'而不是'HttpServlet'不是更好,即使它只是一個例子? – alexander 2015-03-12 13:46:00

+0

可以針對不同的servlet URL模式執行過濾器。您不能用servlet替換過濾器。 – 2016-02-07 18:52:32

+0

他想要一個過濾器行爲,而不是一個servlet。我想他已經將這些URL映射到servlet。 – 2016-07-27 08:06:36