2014-12-21 55 views
0

架構是midTier Liberty服務器,它接收http請求和代理到各種後端,某些REST,一些只是JSON。當我配置SSL(僅通過envVars這非常酷)...看起來我得到一個完整的握手w /每個請求。另外,服務器端在每個請求中使用不同的線程(可能是相關的)。這是Liberty,因此它是多線程的。 Servlet對POJO有靜態引用,可以完成所有apache httpClient的工作。不使用HttpClientContext(在這種情況下)。基本流程是在年底(掙扎W /格式化後合法性)多線程客戶端中的每個請求的ssl握手

envvars中有:

-Djavax.net.ssl.keyStore=/root/lWasServers/certs/zosConnKey.jks 
-Djavax.net.ssl.trustStore=/root/lWasServers/certs/zosConnTrust.jks 
-Djavax.net.ssl.keyStorePassword=fredpwd 
-Dhttp.maxConnections=40 

看着很多類似的問題,但同樣的,現在這個流程不使用客戶端上下文。希望我錯過簡單的事情。代碼被添加到第一個響應中,因爲我在這裏繼續在RHEL中使用FF來處理這個問題。

private static PoolingHttpClientConnectionManager cm = null ; 
private static CloseableHttpClient httpClient = null ; 
// .... 
cm = new PoolingHttpClientConnectionManager(); 
cm.setMaxTotal(512); 
cm.setDefaultMaxPerRoute(256) ; 
httpClient = HttpClients.custom().setConnectionManager(cm).build() ; 
// ... 
responseBody = httpClient.execute(httpGet, responseHandler); 
+0

服務器是否需要或希望客戶端身份驗證? – oleg

+0

感謝您的回覆。答案是肯定的... midTier是另一臺服務器,在這個原型中,midTier是可信的,因此您需要客戶端證書。再次感謝。 –

回答

0

如果一個持久的HTTP連接是有狀態的,與特定的安全上下文或身份,如SSL密鑰或NTLM用戶名相關聯,HttpClient的努力,以確保該連接不會被意外中的不同重複使用安全上下文或由不同的用戶。通常讓HttpClient知道請求在邏輯上相關並且屬於同一個會話的最直接方式是通過使用相同的HttpContext實例執行這些請求。詳情請參閱HttpClient tutorial。如果HttpClient只能由單個用戶訪問或在同一安全上下文中訪問,則還可以禁用連接狀態跟蹤。謹慎使用。

+0

我認爲這可能會回到設置HttpClientContext(因爲我的代碼是threadSafe,我需要找出該上下文的範圍......可能是我只需要玩這個)。值得信賴的midTier ...我可能只是需要讓我的頭多瞭解多少上下文並重新使用相同的。 –

+0

所以,一個問題...因爲我不控制線程(我是服務器中的一個線程)...如果我只彙集httpClientContexts,以避免同時使用它們...因爲我是一個midTier信任的來源...將pooling的clientContexts是正確的路要走嗎? –

+0

所有你需要做的就是保持相同的HttpContext實例相同邏輯會話(例如,如果你的代碼是一個web應用程序,將它存儲爲HttpSession的一個屬性)在你的特殊情況下,如果你不需要維護由SSL私鑰代表的不同用戶身份,我可以完全禁用連接狀態跟蹤。 – oleg

0

好的,雖然我並不是讀取ssl trace的專家,但我相信我已經解決了它。我在一個線程上,但是由服務器控制。我現在將HttpSession傳入並保留對現在爲每個會話創建的HttpClientConnection的引用。我彙集了這些HttpClientConnection對象(基本池,基本上只是獲取/釋放)。所以在一個http會話中所有的調用都使用相同的HttpClientContext。現在看來,我並不是一直在握手。可能有更好的方法來做到這一點,但這確實起作用,我有幾個gremlins可以查看(套接字超時時間爲1毫秒,在<?)......但我相信我不再是長時間握手每次請求(每次只需要創建一個新的上下文)......所以這都很好。謝謝,