ServletFilter已调用,但在Jetty上被忽略

ServletFilter已调用,但在Jetty上被忽略,jetty,servlet-filters,Jetty,Servlet Filters,我无法在Jetty目标6.1.25上运行这个非常基本的ServletFilter,但我也尝试了8.1.10 我可以在日志中看到,实际上调用了过滤器,并且头值的设置没有错误,但是它们不会出现在客户端,因此这些值会被忽略或覆盖 更奇怪的是,当另外设置GzipFilter时,过滤器工作,并且头值仅在压缩请求的客户端可见 有人能复制这个,或者告诉我我做错了什么 这是过滤器: public class AppCacheFilter implements Filter{ public void doFil

我无法在Jetty目标6.1.25上运行这个非常基本的ServletFilter,但我也尝试了8.1.10

我可以在日志中看到,实际上调用了过滤器,并且头值的设置没有错误,但是它们不会出现在客户端,因此这些值会被忽略或覆盖

更奇怪的是,当另外设置GzipFilter时,过滤器工作,并且头值仅在压缩请求的客户端可见

有人能复制这个,或者告诉我我做错了什么

这是过滤器:

public class AppCacheFilter implements Filter{

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    chain.doFilter(request, response);

    System.out.println("response: " + httpResponse);
    httpResponse.setHeader("Cache-Control", "max-age=2,public");
    httpResponse.setHeader("X-Powered-By", "X-Power");
    httpResponse.setHeader("Warning", "Whatever");
    System.out.println("response: " + httpResponse);

}

public void init(FilterConfig filterConfig) throws ServletException {}
public void destroy() {}
}
这是web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <filter>
    <filter-name>AppCacheFilter</filter-name>
    <display-name>AppCache Filter</display-name>
    <filter-class>de.socsoc.filter.AppCacheFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>AppCacheFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
将httpResponse.setHeader调用移动到chain.doFilterrequest、response之前,如下所示:

HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;

System.out.println("response: " + httpResponse);
httpResponse.setHeader("Cache-Control", "max-age=2,public");
httpResponse.setHeader("X-Powered-By", "X-Power");
httpResponse.setHeader("Warning", "Whatever");
System.out.println("response: " + httpResponse);

chain.doFilter(request, response);

一般来说,如果您已经在响应中写入了一些内容,则不应该添加标题。有些服务器会向您发送已提交的响应错误消息,有些服务器可能会默默地忽略您添加的头。通过将其移动到chain.doFilter的前面,您可以确保响应中没有写入任何内容,并且可以安全地设置标题。

谢谢,不幸的是,在chain.doFilter之前更改标题并不会改变行为。@schulzki,所以可能是Jetty的问题。我已经在两个容器WebSphereAppServer8.5.5.1和WebSphereLibertyCore8.5.5.1上测试了它,并且在这两个容器上都运行良好。测试标题是否通过FireBug设置。是的,这是一个码头问题。考虑到Gas的答案+使用jetty 8.1.15+删除默认servlet的缓存控制设置,最终修复了它。请注意,这在Jetty 6.x上不起作用!无论是否配置了缓存控制,默认servlet都会覆盖缓存控制头!