繁体   English   中英

如何为基于Apache HttpComponents的服务器添加Keep-Alive标头?

[英]How to add Keep-Alive header for server based on Apache HttpComponents?

仅在连接要持久的情况下,才如何使用Apache HttpComponents将“ Connection:Keep-Alive”和“ Keep-Alive:timeout = x,max = y”标头添加到响应中?

如果HttpComponents决定此连接将不会持久,则在响应后添加“ Connection:close”标头。 在这种情况下,我不需要Keep-Alive标头。

为什么我这样做:

对于HttpComponents,标准行为是对持久连接的响应不做任何更改,对于非持久连接则添加“ Connection:close”。 在大多数情况下,此方法效果很好。

我想要一个Keep-Alive标头,因为基于标准java.net.HttpURLConnection的客户端将在不活动5秒后超时并丢弃连接,除非服务器先前的响应中没有Keep-Alive标头。 我想使用Keep-Alive定义比5秒更长的超时时间。

您可以根据响应来自org.apache.http.protocol.ResponseConnControl的评估将HttpResponseInterceptor添加到响应中,以添加“ Connection:Keep-Alive”和“ Keep-Alive:timeout = x,max = y”标头,连接:在需要时关闭“”标题。

class ResposeKeepAliveHeaderMod implements HttpResponseInterceptor {

    @Override
    public void process(HttpResponse response, HttpContext context)
            throws HttpException, IOException {
        final Header explicit = response.getFirstHeader(HTTP.CONN_DIRECTIVE);
        if (explicit != null && HTTP.CONN_CLOSE.equalsIgnoreCase(explicit.getValue())) {
            // Connection persistence explicitly disabled
            return;
        }else{
            // "Connection: Keep-Alive" and "Keep-Alive: timeout=x, max=y" 
            response.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_KEEP_ALIVE);
            response.setHeader(HTTP.CONN_KEEP_ALIVE, "timeout=30, max=100");
        }

    }      
   }

您需要在ResponseConnControl之后将其添加到HttpProcessor中:

HttpProcessor httpProcessor = HttpProcessorBuilder.create()
            //.addFirst(new RequestTrace())
            .add(new ResponseDate())
            //.add(new ResponseServer("MyServer-HTTP/1.1"))
            .add(new ResponseContent())
            .add(new ResponseConnControl())
            .addLast(new ResposeKeepAliveHeaderMod())
            .build();

然后构建服务器:

final HttpServer server = ServerBootstrap.bootstrap()
            .setListenerPort(9090)
            .setHttpProcessor(httpProcessor)
            .setSocketConfig(socketConfig)
            .setExceptionLogger(new StdErrorExceptionLogger ())
            .setHandlerMapper(handle_map)
            .create();

我没有尝试过,但是看来您可以为您的httpCleint编写自定义的“ ConnectionKeepAliveStrategy”。 这是文档HttpComponents自定义策略

请参阅第2.11节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM