2012-10-22 69 views
2

我已經閱讀了很多例子,雖然我似乎有一個'確切'的副本,所以我不知道爲什麼我的過濾器將執行時,我導航到/login而不是/restricted/*。 我已經嘗試了兩個註釋(如下例所示)和XML來定義WebFilter。WebFilter urlPatterns ignored

web過濾

@WebFilter(filterName = "AuthenticationFilter", servletNames = { "Faces Servlet" }, urlPatterns = { "/restricted/*" }) 
public class AuthenticationFilter implements Filter { 
    @Inject 
    private SessionManager sessionManager; 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
     System.out.println("Active AuthenticationFilter"); 
     if (sessionManager.getUser() == null) { 
      ((HttpServletResponse) response).sendRedirect("/login"); 
     } 
     else { 
      chain.doFilter(request, response); 
     } 
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void destroy() { 
    } 
} 

的web.xml

<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 
<filter> 
    <filter-name>Pretty Filter</filter-name> 
    <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class> 
    <async-supported>true</async-supported> 
</filter> 
<filter-mapping> 
    <filter-name>Pretty Filter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>ERROR</dispatcher> 
    <dispatcher>ASYNC</dispatcher> 
</filter-mapping> 
<filter> 
    <filter-name>NoCacheFilter</filter-name> 
    <filter-class>filter.NoCacheFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>NoCacheFilter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<filter> 
    <filter-name>AuthenticationFilter</filter-name> 
    <filter-class>filter.AuthenticationFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>AuthenticationFilter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/restricted/*</url-pattern> 
</filter-mapping> 

注意

即使過濾器在這兩個文件中定義的,我可以保證我不是同時使用兩種符號。爲了測試和審查,我將它們都發布了。

我是新來的使用webfilters,並找不到多使用多個過濾器。但是我讀過的,你可以使用多個,他們將按照你在web.xml中定義的順序執行。

問題

有沒有人有一個線索,爲什麼我的過濾器將網頁上的作爲/login過於執行? 該應用程序在Glassfish 3.1.2上運行。

回答

6

<filter-mapping>匹配條件不包括在內,它們是排他性的。

用下面的映射

<filter-mapping> 
    <filter-name>AuthenticationFilter</filter-name> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/restricted/*</url-pattern> 
</filter-mapping> 

你基本上指示該過濾器應該被調用每當FacesServlet要調用每當URL模式匹配/restricted/*

這不是你所期望的「和」條件。只要刪除<servlet-name>條目。

正確@WebFilter聲明將被

@WebFilter("/restricted/*") 

假設你不需要<filter-mapping>(如果訂單是無關緊要的,例如)。

+0

好的,我會試試看。我的確希望這個「和」的情況,因爲我看到了很多例子,其中定義了一個servlet名稱。我會在測試後報告我的發現。 – Aquillo

+0

過濾器也可以完美地映射到特定的servlet。這通常更簡單,因爲單個servlet可能會映射到多個URL模式(例如,某些webapps在'/ faces/*','* .faces'和'* .jsf'上映射'FacesServlet';這會很乏味在過濾器映射中重複這些模式)。 – BalusC

+0

說實話。我並沒有想過要試驗Servlet。但我到了那裏,很快就會遇到另一個挑戰。回到主題,你的解決方案的工作原理,我似乎以前工作過,但我誤解了另一個錯誤(我漂亮的過濾器重定向'/帳戶'爲'/ restricted/account',所以預計擊中'/ restricted/*'因爲這個過濾器出現在Pretty Filter之後,但是這是由於是相同的請求,不是嗎?)。 – Aquillo