我正在开发一个作为嵌入式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。
答案 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);