2012-10-25 57 views
2

首先,我會在處理我的問題之前向您介紹我的測試用例。 有我的基本Maven的web應用的幾個組成部分:JSF PrettyFaces導致過濾器鏈'破壞'

  • page.xhtml:用於生成我的請求/應答(啓動過濾)
  • 漂亮的面孔:基於需求中重新定義的URL,我客戶
  • FirstFilter:要漂亮的面孔之前執行(在這個體育場用於測試目的)
  • ThirdFilter:要漂亮的面孔後執行(在這個體育場用於測試目的)
  • web.xml中:定義行爲我的完整過濾器鏈

我會分享重要組件的代碼。

漂亮-config.xml中

<url-mapping id="page"> 
    <pattern value="/page" /> 
    <view-id value="/page.xhtml" /> 
</url-mapping> 

FirstFilter.java

@WebFilter 
public class FirstFilter implements Filter { 
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     System.out.println("FirstFilter, request: " + 
       ((HttpServletRequest)request).getRequestURL().toString()); 
     chain.doFilter(request, response); 
     System.out.println("FirstFilter, response"); 
    } 

    // override init and destroy 
} 

ThirdFilter.java

@WebFilter 
public class ThirdFilter implements Filter { 
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     System.out.println("ThirdFilter, request: " + 
       ((HttpServletRequest)request).getRequestURL().toString()); 
     chain.doFilter(request, response); 
     System.out.println("ThirdFilter, response"); 
    } 

    // override init and destroy 
} 

的web.xml

<filter> 
    <filter-name>FirstFilter</filter-name> 
    <filter-class>nl.mhoogeveen.nl.rootapplication.FirstFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>FirstFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
<filter> 
    <filter-name>Pretty Filter</filter-name> 
    <filter-class>testingapplications.filterchaining.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>ThirdFilter</filter-name> 
    <filter-class>testingapplications.filterchaining.ThirdFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ThirdFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

現狀

調用本地主機:8080/page.xhtml(並因此不是激活漂亮的面孔重定向)

INFO: FirstFilter, request: http://localhost:8080/page.xhtml 
INFO: ThirdFilter, request: http://localhost:8080/page.xhtml 
INFO: ThirdFilter, response 
INFO: FirstFilter, response 

調用本地主機:8080 /頁面(並因此激活漂亮臉部重定向)

INFO: FirstFilter, request: http://localhost:8080/page 
INFO: FirstFilter, response 

問題

是什麼原因造成這種情況在我的鏈將是不完整?它不會被切斷,因爲我仍然在FirstFilter上得到我的迴應。它似乎沒有達到ThirdFilter。

我的web.xml有什麼問題,我是否缺少dispatcher

在此先感謝。

回答

6

您的調度員設置不正確。讓我解釋發生了什麼:

/page的請求進入並且首先由FirstFilter處理。之後,PrettyFaces截獲請求並將其轉發至/page.xhtml。這個轉發的請求被作爲一個新的請求處理,因此會再次思考過濾器鏈。但是您的過濾器沒有任何調度員設置,與設置<dispatcher>REQUEST</dispatcher>相同。在這個配置中,過濾器僅適用於常規請求,而不適用於轉發請求。

如果您還想將過濾器應用於轉發的請求,則必須將<dispatcher>FORWARD</dispatcher>添加到過濾器配置中。

這也是爲什麼你通常要對第三方濾鏡像MyFaces的戰斧/ PrimeFaces調整調度設置等請參見常見問題解答問題2:

http://ocpsoft.org/prettyfaces/#section-16

+0

精湛的答案。我已經認爲我的調度員是錯誤的,但我確實知道很多關於實際處理請求的方式。我正在讀這些調度員,但你的解釋更清楚。感謝Chkal! – Aquillo

+0

好的問題,甚至更好的答案=好的線程 –