簡體   English   中英

在匹配規則后,為什么Tuckey UrlRewrite不調用過濾器調用chain.doFilter?

[英]Why Doesn't Tuckey UrlRewrite Filter call chain.doFilter after a rule is matched?

在這里使用Spring Framework ......

我創建了一個過濾器來更改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>

(出於多種原因,我們需要這個)

因此,路徑以“/ styles-special /”開頭的任何* .css文件將被重寫為“/ styles /”,並且不會調用cssFilter,而是任何路徑以“/”開頭的* .css文件styles /“將按預期運行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)

這是Filter的代碼片段:

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
...

當Tuckey UrlRewrite Filter重寫URL時,它會將請求轉發給新URL,而不是將其傳遞給過濾器鏈。 默認情況下,過濾器不會應用於轉發的請求,因此您需要對其進行配置:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM