使用Jetty和Apache CXF时如何消除重复的Date标头?

时间:2012-05-31 21:06:38

标签: http-headers jetty cxf embedded-jetty

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

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

接下来创建一些上下文来绑定/,/ app和/ api中的特定servlet。

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

有没有办法将Jetty配置为仅添加Date标头(如果在处理结束时它不存在)或者是否有办法禁用CXF插入Date:headers?

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

1 个答案:

答案 0 :(得分:2)

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

最后,我必须编写一个ServletFilter和ResponseWrapper,它只用在/ api Context上。 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);
        }
    }
}

然后配置嵌入式jetty服务器

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);