Почему фильтр Tuckey UrlRewrite не вызывает chain.doFilter после сопоставления правила? - PullRequest
5 голосов
/ 18 февраля 2011

Используя 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>

(это необходимо по ряду причин)

, поэтому любой файл * .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)

Вот фрагмент кода из фильтра:

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

1 Ответ

14 голосов
/ 18 февраля 2011

Когда 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>
...