我正在使用Spring
和CXF
来创建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]
答案 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);