2014-12-02 418 views
2

我使用SpringCXF來創建soap web服務客戶端。如何在CXF客戶端動態添加HTTP頭文件?

webservice需要HTTP標頭Authorization=[pass]進行驗證。到目前爲止,我實現它,如下所示:

Map<String, Object> context = ((BindingProvider) port).getRequestContext(); 
Map<String, List<String>> headers = new HashMap<>(); 
headers.put("Authorization", Arrays.asList("Basic pass")); //fixed value so far 
context.put(MessageContext.HTTP_REQUEST_HEADERS, headers); 

但現在我必須要改變動態地根據實際執行的客戶端的用戶的基本合格。

問題:因爲我在Spring中使用CXF,所以我的CXF客戶端由Spring管理和共享代理。 因此,無論何時我更改port中的HTTP標頭,它都會影響所有實例!

如何在發送web服務請求時動態添加HTTP auth頭?

我必須準確地創建一個HTTP頭LIK:Authorization=[pass]

回答

0

也許你應該配置春在自己的會話的每個用戶的工作,所以客戶機實例將是爲每個用戶不同。而對於客戶機實例,你可以做同樣的事情:

Client proxy = ClientProxy.getClient(stub); 

// Creating HTTP headers 
Map<String, List<String>> headers = new HashMap<String, List<String>>(); 
headers.put("Authorization", Arrays.asList("Basic pass")); 

// Add HTTP headers to the web service request 
proxy.getRequestContext().put(Message.PROTOCOL_HEADERS, headers); 
+0

但是,這將增加一個'肥皂:header'元素,右?我需要的是一個名爲「授權」的HTTP標頭元素,以便創建'Authorization = [Basic pass]'標頭。而「基本通行證」必須是由soap服務設計的'base64(username:password)'編碼字符串。我認爲這對於httpconduit來說是不可能的,不是嗎? – membersound 2014-12-02 15:06:44

+0

哦。你是對的。 – Genie 2014-12-02 15:12:00

+0

新版本怎麼樣? =) – Genie 2014-12-02 15:21:34

2

我假設你真的想要做的是HTTP基本身份驗證。 CXF中定義了用於設置BASIC認證的用戶名/密碼的API。這將做你想要什麼:

HTTPConduit httpConduit = (HTTPConduit) ClientProxy.getClient(stub).getConduit(); 
httpConduit.getAuthorization().setUserName("username"); 
httpConduit.getAuthorization().setPassword("password"); 

也有其他的選擇,比如把用戶名/密碼直接進入請求上下文:

AuthorizationPolicy authzPolicy = new AuthorizationPolicy(); 
authzPolicy.setUserName("username"); 
authzPolicy.setPassword("password"); 
((BindingProvider) stub).getRequestContext().put(AuthorizationPolicy.class.getName(), authzPolicy); 
+0

這將在代理請求上下文中靜態更改HTTP標頭。它適用於單個用戶,但不適用於動態線程安全。如果你有一個線程安全的解決方案,例如一個動態添加到xml請求的http頭,請告訴我。 – membersound 2015-01-07 16:34:51

+0

無論使用'AuthorizationPolicy'解決方案應該可能是實現基本授權的首選方式,而不是手動構建http頭。感謝這一點。 – membersound 2015-01-08 09:07:42

+0

@membersound我試圖以線程安全的方式獲得相同的行爲。現在,我在客戶端對象上使用了攔截器,這不是線程安全的並導致問題。因此,我將需要每次創建一個端口。如果您有任何有用的相關信息,請分享。 – Sachin 2017-11-09 05:58:03