最初HTTP被設計爲無狀態的。然而,真實的應用中經常要可以經過幾個邏輯相關的請求/響應保持狀態信息。爲了使應用程序可以保持一個處理狀態,HttpClient容許HTTP請求在特定的執行上下文內執行,稱爲HTTP上下文。若是相同的上下文在連續的請求之間重用,多個邏輯相關的連續請求能夠參與一個邏輯會話。HTTP上下文的功能相似於java.util.Map<String,Object>,它只不過是任意命名的值的集合。應用程序能在請求執行以前填充上下文屬性,也能在請求執行完成以後檢查上下文。java
HttpContext能包含任意對象,所以,可能不是線程安全的。建議每一個執行線程維護本身的上下文。安全
在HTTP請求執行的過程當中,HttpClient添加如下屬性到執行上下文:服務器
HttpConnection:它表明鏈接到目標服務器的實際鏈接。ui
HttpHost:它表明鏈接目標。線程
HttpRoute:它表明一個完整的鏈接路由。設計
HttpRequest:它表明一個真實的HTTP請求。在上下文中的最後的HttpRequest對象老是表明一個精確的消息狀態被髮送到目標服務器。默認的HTTP1.0和HTTP1.1使用相對的請求URI,然而請求是在非隧道模式中經過代理髮送的,那麼它是絕對URI。代理
HttpResponse:它表明當前的HTTP響應。code
java.lang.Boolean:它表明一個標誌,標識當前請求是否已經被徹底傳送到鏈接目標。對象
RequestConfig:它表明當前請求的配置。
路由
java.util.List<URI>:它表明在請求執行過程當中接收到的全部重定向地址的集合。
咱們可使用HttpClientContext適配器類來簡化與上下文狀態之間的相互做用:
HttpContext context = <...> HttpClientContext clientContext = HttpClientContext.adapt(context); HttpHost target = clientContext.getTargetHost(); HttpRequest request = clientContext.getRequest(); HttpResponse response = clientContext.getResponse(); RequestConfig config = clientContext.getRequestConfig();
表明一個邏輯相關會話的多請求序列應執行在同一個HttpContext實體中,確保會話上下文與狀態信息在請求間自動傳播(示例銜接上面的示例):
CloseableHttpClient httpclient = HttpClients.createDefault(); RequestConfig requestConfig = RequestConfig.custom(). setSocketTimeout(1000).setConnectTimeout(1000).build(); HttpGet httpget1 = new HttpGet("http://localhost/1"); httpget1.setConfig(requestConfig); //context上個示例中定義了 CloseableHttpResponse response1 = httpclient.execute(httpget1, context); try { HttpEntity entity1 = response1.getEntity(); } finally { response1.close(); } HttpGet httpget2 = new HttpGet("http://localhost/2"); CloseableHttpResponse response2 = httpclient.execute(httpget2, context); try { HttpEntity entity2 = response2.getEntity(); } finally { response2.close(); }