2012-01-07 34 views
1

如何在使用Apache HttpComponents的響應中添加「Connection:Keep-Alive」和「Keep-Alive:timeout = x,max = y」頭文件?如何爲基於Apache HttpComponents的服務器添加Keep-Alive頭文件?

如果HttpComponents認爲這個連接不會持久化,那麼在給出響應之後,會添加一個「Connection:close」標頭。在這種情況下,我不需要Keep-Alive標題。

爲什麼我這樣做:

標準的行爲是HttpComponents不了了之在持久連接的響應改變,並添加「連接:關閉」的非持久性連接。這在大多數情況下運作良好。

我想擁有一個Keep-Alive頭,因爲基於標準java.net.HttpURLConnection的客戶端會超時並在5秒鐘不活動後丟棄連接,除非在上一個響應中存在Keep-Alive頭服務器。我想用Keep-Alive來定義比5秒更長的超時時間。

+0

可能重複[如何添加,設置和獲取頭的請求HttpClient?](http://stackoverflow.com/questions/13743205/how-to-add-set-and-get-header-in-request-of-httpclient) – 2015-03-05 14:07:18

+0

這不是http://的重複stackoverflow.com/questions/13743205/how-to-add-se t-and-get-header-in-request-of-httpclient - 我問的是服務器端,而不是HttpClient(順便提一下,我也是在11個月前發佈的) – 2015-03-07 00:10:55

回答

1

您可以添加HttpResponseInterceptor,它增加了「連接:保持活動」文件HttpComponents Custom stratagey

參見段和「保持活動:超時= X,最大值= Y」視標頭的響應來自org.apache.http.protocol.ResponseConnControl的評估,它在需要時設置「Connection:close」標題。

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"); 
     } 

    }  
    } 

你需要把它添加到HttpProcessor,ResponseConnControl後:

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(); 
0

我還沒有嘗試過,但它似乎可以爲您的httpCleint編寫自定義的「ConnectionKeepAliveStrategy」。這裏是2.11

+0

是的,按照你說的做是一個解決方案誰正在編寫服務器和客戶端本身,並可以在客戶端使用HttpClient。但在這種情況下,我需要我的服務器發送Keep-Alive標題,因爲我不控制所有客戶端。 – 2012-01-07 15:09:03

相關問題