我一直把头发拉过这个,但我无法让它发挥作用.我有一个我调用的web服务生成一个安全令牌,然后需要将其传递给SOAP头内的后续服务调用.我得到了那个部分工作得很好,但标题部分让我绊倒(我使用cxf wsdl2java生成了客户端).这是应该添加的部分:
<wsse:BinarySecurityToken ValueType="XXXX" EncodingType="wsse:Base64Binary" wsu:Id="SecurityToken">
My token
</wsse:BinarySecurityToken>
Run Code Online (Sandbox Code Playgroud)
我试过像这样使用WSS4JOutInterceptor:
Endpoint endpoint = client.getEndpoint();
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put("SecurityToken", MY-TOKEN);
endpoint.getOutInterceptors().add(new WSS4JOutInterceptor(outProps));
Run Code Online (Sandbox Code Playgroud)
但那没用.我尝试直接将它添加到标题中(根据此问题):
List<Header> headers = new ArrayList<Header>();
SOAPFactory sf = SOAPFactory.newInstance();
SOAPElement authElement = sf.createElement(new QName(null, "wsse:BinarySecurityToken"));
authElement.setAttribute("ValueType", "XXXX");
authElement.setAttribute("EncodingType", "wsse:Base64Binary");
authElement.setAttribute("wsu:Id", "SecurityToken");
authElement.addTextNode(MY-TOKEN);
SoapHeader tokenHeader = new SoapHeader(
new QName(null, "wsse:BinarySecurityToken"), authElement);
headers.add(tokenHeader);
((BindingProvider) service).getRequestContext().put(Header.HEADER_LIST, headers);
Run Code Online (Sandbox Code Playgroud)
它看起来几乎没问题
<soap:Header><BinarySecurityToken EncodingType="wsse:Base64Binary" ValueType="XXXX" wsu:Id="SecurityToken">MY-TOKEN</BinarySecurityToken></soap:Header>
Run Code Online (Sandbox Code Playgroud)
BinarySecurityToken部分缺少wsse:前缀,但调用失败.
有没有人得到类似工作的东西 - 或者我完全错了吗?