http-headers - 使用 Jetty 和 Apache CXF 时如何消除重复的日期 header ?

标签 http-headers jetty cxf embedded-jetty

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

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

接下来创建一些上下文来绑定(bind)/、/app 和/api 处的特定 servlet。

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

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

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

最佳答案

看来 CXF 必须使用 addHeader 而不是 setHeader,后者会替换 Jetty 已经插入的值。

最后我不得不编写一个仅在/api 上下文中使用的 ServletFilter 和 ResponseWrapper。 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);

关于http-headers - 使用 Jetty 和 Apache CXF 时如何消除重复的日期 header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10841271/

相关文章:

java - 如何装饰所有请求以从 header 中取值并将其添加到正文参数中?

android - Volley - 带有 header 的 POST 请求

java - 如何向正在运行的 Jetty 应用程序添加 Weld CDI 支持?

java - org.apache.catalina.core.ContainerBase : A child container failed during start

java - CXF JAXRS - 如何 POST 多个参数

service - 从 Axis2 到 CxF 的迁移指南

Golang : implements http server health checking. gocraft/health

wcf - 如何在自定义 WCF HTTP 绑定(bind)中存储 header 信息

ssl - 在 Heroku 上使用 ring 监听 HTTPS 端口时出现权限被拒绝错误

grails - 关于disableCNCheck选项的wsdl2java CXF命令行错误