如何在CXF客户端中动态添加HTTP标头?

时间:2014-12-02 14:47:43

标签: java spring web-services soap cxf

我正在使用SpringCXF来创建soap webservice客户端。

Web服务需要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标头:Authorization=[pass]

2 个答案:

答案 0 :(得分:3)

我假设您真正想要做的是HTTP BASIC身份验证。 CXF中定义了API以设置BASIC身份验证的用户名/密码。这将做你想要的:

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

答案 1 :(得分:0)

也许您应该将Spring配置为在自己的会话中与每个用户一起工作,因此每个用户的客户端实例都会有所不同。对于客户端实例,您可以执行类似的操作:

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