java - 为什么Tuckey UrlRewrite Filter在规则匹配后不调用chain.doFilter?

标签 java spring url-rewriting servlet-filters tuckey-urlrewrite-filter

在这里使用Spring框架...

我创建了一个过滤器来更改 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,但是任何路径以 w 开头的 *.css 文件/"/styles/"将按预期运行通过 cssFilter。

我已经尝试将 cssFilter 的 url-pattern 更改为许多不同的选项,但结果相同。在我看来,tuckey urlrewrite 过滤器在重写后不会调用 chain.doFilter(),但也许它比这更复杂?

知道这里可能有什么问题吗?这是预期的功能吗?任何解决方法? ...也许拦截器或 Controller 是去这里的方式?

提前感谢您对此的任何建议!!


注意:使用以下内容(如 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
...

最佳答案

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

关于java - 为什么Tuckey UrlRewrite Filter在规则匹配后不调用chain.doFilter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5043593/

相关文章:

javascript - 如何在node.js和express中隐藏URL中的内容但仍然需要发送到服务器?

apache - RewriteRule (contact.php -> contact) + 404 重定向总是给我一个 404 页面

.htaccess - ISAPI 重写查询字符串

java - 为 Android 表格布局动态填充数据

java - 如何等待 "Minus"按键输入

java - Spring Boot 和配置文件

Spring Data Rest @EmbeddedId 无法从 Post Request 构造

java - 这会被认为是糟糕的 RESTFul 设计吗?

java - RSA Java 加密和 Node.js 解密不起作用

java - ActiveMQ 生产者生成堆转储