为什么在匹配规则后没有Tuckey UrlRewrite过滤器调用chain.doFilter?

在这里使用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>
    

要回复问题请先登录注册