Почему Tuckey UrlRewrite Filter не вызывает Chain.doFilter после сопоставления правила?
-
15-11-2019 - |
Вопрос
Использование 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>