5

在這裏使用Spring Framework ...爲什麼不Tuckey UrlRewrite在規則匹配後過濾調用chain.doFilter?

我創建了一個過濾器來更改css文件的響應正文,如果我直接調用它的url,它會運行。但是,如果urlrewrite規則匹配,則會跳過篩選器。

示例: 在web.xml:

<filter> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
    <!-- skipping init params here for brevity --> 
</filter> 
<filter-mapping> 
    <filter-name>UrlRewriteFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter> 
    <filter-name>cssFilter</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 
    <filter-mapping> 
    <filter-name>cssFilter</filter-name> 
    <url-pattern>*css</url-pattern> 
</filter-mapping> 

有一個在urlrewrite.xml設置像這樣的映射:

<rule> 
    <from>/styles-special/(.*)$</from> 
    <to last="true">/styles/$1</to> 
</rule> 

(我們需要此爲許多原因)

因此,其路徑以w /「/ styles-special /」啓動的任何* .css文件將被重寫爲「/ styles /」,並且cssFilter將不會被調用,但其路徑以w /「/ styles /」開頭的任何* .css文件將按預期運行通過cssFilter。

我試過將cssFilter的url-pattern改爲許多不同的選項,但是結果相同。在我看來,像tuckey的urlrewrite過濾器在重寫之後並不會調用chain.doFilter(),但也許它比這更復雜?

有什麼想法可能在這裏?這是預期的功能嗎?任何解決方法? ...也許一個攔截器或控制器是去這裏的路?

在此先感謝您的任何意見!


注意:使用以下(由axtavt建議):

<dispatcher>REQUEST</dispatcher> 
<dispatcher>FORWARD</dispatcher> 

修復該問題瓦特/鏈接和過濾器運行。不過,我得到以下錯誤:

java.lang.IllegalStateException: NO CONTENT 
at org.mortbay.jetty.HttpGenerator.addContent(HttpGenerator.java:106) 
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:644) 
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:579) 

這裏的代碼片段從篩選:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    HttpServletResponse httpResponse = (HttpServletResponse) response; 

    OutputStream out = httpResponse.getOutputStream(); 
    GenericResponseWrapper wrapper = new GenericResponseWrapper(httpResponse); 

    chain.doFilter(request, wrapper); 

    if(log.isDebugEnabled()) log.debug("doFilter: chain"); 

    String respBody = new String(wrapper.getData()); // this throws error 
... 

回答

14

當Tuckey UrlRewrite過濾器重寫一個URL,它請求轉發到新網址,而不是向下傳遞的過濾器鏈。默認過濾器不適用於轉發的請求,所以你需要配置它:

<filter-mapping> 
    <filter-name>cssFilter</filter-name> 
    <url-pattern>*css</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 
+0

太棒了!過濾器運行時,我補充說!不幸的是,當我在GenericResponseWrapper上調用getData時出現錯誤。嗯,我如何發佈代碼片段? – tkane2000 2011-02-18 18:59:47

相關問題