【问题标题】:How can I eliminate duplicate Date headers when using Jetty and Apache CXF?使用 Jetty 和 Apache CXF 时如何消除重复的 Date 标头?
【发布时间】:2012-05-31 21:06:37
【问题描述】:

我正在开发一个作为嵌入式 Jetty 服务器运行的遗留应用程序。第一个被调用的代码是:

Server server = new Server();
server.setSendDateHeader(true);

接下来会创建一些上下文以在 /、/app 和 /api 处绑定特定的 servlet。

绑定到 /api 的 Servlet 扩展了 AbstractCXFServlet 并用于向 RESTful API 返回响应。但是,我发现对 /api 的调用在响应中有重复的 Date: 标头。其他端点的 servlet 不基于 CXF。 Date: header is required 因此删除 server.setSendDateHeader(true) 或将其设置为 false 将不起作用,因为所有对 / 和 /app 的请求都会丢失它。

有没有办法将 Jetty 配置为仅在处理结束时不存在 Date 标头时添加它,或者有没有办法禁止 CXF 插入 Date: 标头?

我正在使用 Jetty v6.1.19 和 CXF v2.3.3。

【问题讨论】:

    标签: http-headers jetty cxf embedded-jetty


    【解决方案1】:

    似乎 CXF 必须使用 addHeader 而不是 setHeader 来替换 Jetty 已经插入的值。

    最后我不得不写一个 ServletFilter 和 ResponseWrapper,它们只在 /api 上下文中使用。 This thread 最终把我送到了这条路。

    DateHeaderStrippingFilter.java

    public class DateHeaderStrippingFilter
        implements Filter
    {
        private HashSet<String> headers;
    
        @Override
        public void destroy()
        {
            headers = null;
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException
        {
            HeaderStripperWrapper wrappedResponse = new HeaderStripperWrapper((HttpServletResponse)response, headers);   
            chain.doFilter(request, wrappedResponse);
        }
    
        @Override
        public void init(FilterConfig config)
            throws ServletException
        {
            headers = new HashSet<String>();
            headers.add("Date");
        }
    }
    

    HeaderStripperWrapper.java

    public class HeaderStripperWrapper
        extends HttpServletResponseWrapper
    {
        private HashSet<String> headersToStrip;
    
        public HeaderStripperWrapper(HttpServletResponse response, HashSet<String> headersToStrip)
        {
            super(response);
            this.headersToStrip = headersToStrip;
        }
    
        @Override  
        public void addHeader(String name, String value)  
        {  
            if (!headersToStrip.contains(name))
            {
                super.addHeader(name, value);
            }
        }  
    
        @Override  
        public void setHeader(String name, String value)  
        {  
            if (!headersToStrip.contains(name))
            {
                super.setHeader(name, value);
            }
        }
    }
    

    然后在配置嵌入式码头服务器时

    Context api = new Context(contexts, "/api", false, false);
    BooksApiServlet apiServlet = env.getInjector().getInstance(ApiServlet.class);   
    ServletHolder holder = new ServletHolder(apiServlet);
    api.addServlet(holder, "/*");
    api.addFilter(DateHeaderStrippingFilter.class, "/*", 0);
    

    【讨论】:

      猜你喜欢
      • 2013-12-18
      • 1970-01-01
      • 2019-12-03
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多