我正在开发一个作为嵌入式 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/