Почему Tuckey UrlRewrite Filter не вызывает Chain.doFilter после сопоставления правила?

StackOverflow https://stackoverflow.com/questions/5043593

Вопрос

Использование Spring Framework здесь...

Я создал фильтр для изменения тела ответа CSS-файлов, и если я напрямую вызываю URL-адрес, он запускается.Однако если правило перезаписи URL-адресов соответствует правилу, фильтр пропускается.

Пример:В веб.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>

(нам это нужно по ряду причин)

поэтому любой файл *.css, путь которого начинается с / "/styles-special/", будет перезаписан в "/styles/" и cssFilter не будет вызываться, но любой файл *.css, путь которого начинается с / "/ Styles/» будет проходить через cssFilter, как и ожидалось.

Я пробовал изменить шаблон URL-адреса для cssFilter на несколько различных вариантов, но результат тот же.Мне кажется, что фильтр 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 переписывает 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 с атрибуция
Не связан с StackOverflow
scroll top