2

組み込みの Jetty サーバーとして実行されるレガシー アプリケーションに取り組んでいます。呼び出される最初のコードは次のとおりです。

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

次に、/、/app、および /api で特定のサーブレットをバインドするために、いくつかのコンテキストが作成されます。

/api にバインドされたサーブレットは AbstractCXFServlet を拡張し、RESTful API に応答を返すために使用されます。しかし、私が見つけたのは、/api への呼び出しの応答に重複する Date: ヘッダーがあることです。他のエンドポイントのサーブレットは CXF ベースではありません。Date: ヘッダーは必須であるため、/ および /app へのすべてのリクエストでヘッダーが欠落するため、ヘッダーを 削除しserver.setSendDateHeader(true)たり false に設定したりすることはできません。

処理の最後に Date ヘッダーが存在しない場合にのみ Date ヘッダーを追加するように Jetty を構成する方法はありますか、または CXF が Date: ヘッダーを挿入できないようにする方法はありますか?

Jetty v6.1.19 と CXF v2.3.3 を使用しています。

4

1 に答える 1

2

CXF は、Jetty が既に挿入した値を置き換える setHeader の代わりに addHeader を使用する必要があるようです。

最後に、/api コンテキストでのみ使用される ServletFilter と ResponseWrapper を作成する必要がありました。このスレッドは、最終的に私をこのルートに送りました。

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