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

Java 如何在CXF客户端中动态添加HTTP头?,java,spring,web-services,soap,cxf,Java,Spring,Web Services,Soap,Cxf,我正在使用Spring和CXF创建soap-webservice客户端 Web服务需要HTTP头Authorization=[pass]进行身份验证。到目前为止,我实施了以下内容: Map<String, Object> context = ((BindingProvider) port).getRequestContext(); Map<String, List<String>> headers = new HashMap<>(); header

我正在使用
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);
Map context=((BindingProvider)端口).getRequestContext();
Map headers=newhashmap();
headers.put(“授权”,Arrays.asList(“基本通行证”)//迄今为止的固定值
put(MessageContext.HTTP_请求_头,头);
但是现在我必须根据实际执行客户端的用户动态更改基本过程

问题:当我将CXF与Spring一起使用时,我的CXF客户端由Spring管理和共享代理。 因此,每当我更改
端口内的HTTP头时,它都会影响所有实例

如何仅在发送webservice请求期间动态添加HTTP auth头


我必须准确地创建一个http头,比如:
Authorization=[pass]

也许您应该将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);
Client-proxy=ClientProxy.getClient(存根);
//创建HTTP头
Map headers=newhashmap();
headers.put(“授权”,Arrays.asList(“基本通行证”);
//将HTTP头添加到web服务请求
proxy.getRequestContext().put(Message.PROTOCOL_头,头);

我假设您真正想要做的是HTTP基本身份验证。CXF中定义了一些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); 

但这将添加一个
soap:header
元素,对吗?我需要的是一个名为“Authorization”的HTTP头元素,以便创建
Authorization=[Basic pass]
HTTP头。而“基本通行证”必须是soap服务设计的
base64(用户名:密码)
编码字符串。我认为这在httpconductor中是不可能的,不是吗?新版本呢?=)这将在代理请求上下文中静态更改HTTP头。它适用于单个用户,但不是动态线程安全的。这将在代理请求上下文中静态更改HTTP头。它适用于单个用户,但不是动态线程安全的。如果您有线程安全解决方案,例如动态添加到xml请求的http头,请告诉我。无论如何,您使用
AuthorizationPolicy
的解决方案可能是实现基本授权的首选方法,而不是手动构建http头。谢谢您的帮助。@membersound我正试图以线程安全的方式获得相同的行为。现在我在客户机对象上使用拦截器,这不是线程安全的,会导致问题。因此,我每次都需要创建一个端口。如果你有任何有用的相关信息,请分享。@Sachin这几乎是3年前的事了,所以我记不清了。但我认为这是不可能的。我用分配的凭据创建了一个懒惰的“端口缓存”。因此,您必须为要使用的每个不同凭据对创建一个新端口,但仅在第一次访问时实例化并缓存它。Ok。谢谢你的建议:)