2

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

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

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

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

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

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

4

1 回答 1

2

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

最后,我不得不编写一个 ServletFilter 和 ResponseWrapper,它们只在 /api 上下文中使用。该线程最终使我沿着这条路线前进。

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);
于 2012-06-02T22:53:59.487 回答