Java 为什么';t Tuckey UrlRewrite筛选器在匹配规则后调用chain.doFilter?

Java 为什么';t Tuckey UrlRewrite筛选器在匹配规则后调用chain.doFilter?,java,spring,url-rewriting,servlet-filters,tuckey-urlrewrite-filter,Java,Spring,Url Rewriting,Servlet Filters,Tuckey Urlrewrite Filter,在这里使用Spring框架 我创建了一个过滤器来更改css文件的响应体,如果我直接调用url,它就会运行。但是,如果URL重写规则匹配,则跳过筛选器 示例: 在web.xml中: <filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter

在这里使用Spring框架

我创建了一个过滤器来更改css文件的响应体,如果我直接调用url,它就会运行。但是,如果URL重写规则匹配,则跳过筛选器

示例: 在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>
以下是来自筛选器的代码片段:

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>

cssFilter
*css
要求
向前地

太棒了!当我添加它时,过滤器会运行!不幸的是,调用GenericResponseWrapper上的getData时出错。嗯,我如何发布代码片段?不确定这是否是标准的stackoverflow实践,但我编辑了原始帖子来回复这个答案。谢谢你提供的信息,如果你还有更多,我们将不胜感激。。。显然,请求发生了一些事情,但我不知道可能是什么。@tkane2000:GenericResponseWrapper是什么?另外,您确定异常发生在标记行吗?GenericResponseWrapper扩展了HttpServletResponseWrapper并创建了一个新的java.io.ByteArrayOutputStream。总之,你是对的,问题实际上是过滤器映射。我已经将url模式更改为“/styles/*”,因为它也转发了这些内容,但它不喜欢这样,而且“/styles special/*”也不起作用。把它改回“*css”就成功了,希望这就足够了。这看起来确实有点喜怒无常!非常感谢。我必须在Tuckey中使用
last=“true”
,然后使用我自己的过滤器,所以这对我很有帮助!
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
...
<filter-mapping>
     <filter-name>cssFilter</filter-name>
     <url-pattern>*css</url-pattern>
     <dispatcher>REQUEST</dispatcher>
     <dispatcher>FORWARD</dispatcher>
</filter-mapping>