我想豐富自己的HTTP/SOAP請求(與WS出站網關發送)與根據一些自定義HTTP頭什麼實際Message
包含,即添加動態HTTP標頭WS出站網關
- 增加基本身份驗證每個請求,其中憑證依賴於某些
Message.headers
- 添加自定義HTTP標頭只有特定
Message.headers
存在
我考慮了以下解決方案:
- 實現自定義
ClientInterceptor
- 但目前還 Message.header用不上此時 - 實現自定義
SoapHeaderMapper
- 就有機會獲得Message.header
,但我不喜歡這個主意,因爲它是相當意味着 進行操作SOAP信封不在連接/請求級別。 - 實現自定義
WebServiceMessageCallback
- 此時無法訪問消息。
此外,在身份驗證的情況下,上述所有解決方案依賴於我們自己添加必要的HTTP認證頭,而我想做到這一點更正確的方式(至少在我看來),並正確配置HttpClient
。
所以在這一點上我完成了定製HttpComponentsMessageSender
,每個請求設置HttpClientContext
。問題是再次無法訪問Mesage.headers
,因此我完成了ServiceActivator
與SPEL和ThreadLocal
的某種組合,如下所示。
通常它的作品,但...有沒有其他更正確的路徑去?
<int:service-activator expression="@basicAuthenticationMessageSender.setBasicAuth(#root, headers.username, headers.pass)" />
public class BasicAuthenticationMessageSender extends HttpComponentsMessageSender {
private static ThreadLocal<HttpClientContext> httpClientContextLocal = new ThreadLocal<>();
@Override
protected HttpContext createContext(URI uri) {
HttpClientContext httpClientContext = httpClientContextLocal.get();
// This part makes authentication preemptive:
HttpHost targetHost = new HttpHost(uri.getHost(), uri.getPort(), uri.getScheme());
AuthCache authCache = new BasicAuthCache();
authCache.put(targetHost, new BasicScheme());
httpClientContext.setAuthCache(authCache);
return httpClientContext;
}
public GenericMessage setBasicAuth(GenericMessage message, String username, String password) throws Exception {
final HttpClientContext httpClientContext = HttpClientContext.create();
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
httpClientContext.setCredentialsProvider(credentialsProvider);
httpClientContextLocal.set(httpClientContext);
return message;
}
}
Spring集成4.3.11
由於阿爾喬姆。所以我會繼續擴展用於認證的'HttpComponentsMessageSender'。其他具有自定義'DefaultSoapHeaderMapper'的自定義HTTP頭,因爲它可以訪問'Message.headers'。 – kulas