在这里使用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>
(出于多种原因,我们需要这样做)
因此,任何路径以w/“/styles-special/”开头的* .css文件都将被重写为“/styles/”并且不会调用cssFilter,但是任何路径以w/“//开头的* .css文件样式/”将按预期方式通过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)
这是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>