在调用WebService服务端时出现Caused by: org.apache.cxf.binding.soap.SoapFault:
MustUnderstand headers: [{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood.异常信息,调用方式如下:
客户端代码:
...
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 注册WebService接口
factory.setServiceClass(IRemoteAccessor.class);
// 设置WebService地址
factory.setAddress(webServiceUrl);
//***注入拦截器,用于加密安全验证信息************************
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
outProps.put(WSHandlerConstants.USER, userName);
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, WsClinetAuthHandler.class.getName());
ArrayList<SoapInterceptor> list = new ArrayList<SoapInterceptor>();
list.add(new SAAJOutInterceptor());
list.add(new WSS4JOutInterceptor(outProps));
factory.getOutInterceptors().addAll(list);
IRemoteAccessor remoteAccessor = (IRemoteAccessor)factory.create();
Client proxy = ClientProxy.getClient(remoteAccessor);
HTTPConduit conduit = (HTTPConduit)proxy.getConduit();
TLSClientParameters tlsParams = conduit.getTlsClientParameters();
if (tlsParams == null){
tlsParams = new TLSClientParameters();
}
tlsParams.setTrustManagers(getTrustManagers(keyStorePath,keyStorePassword,keyStoreType));
tlsParams.setDisableCNCheck(true);
tlsParams.setSecureSocketProtocol("SSL");
conduit.setTlsClientParameters(tlsParams);
String outXML = "";
outXML = remoteAccessor.invoke(inXml);
return outXML;
通过检查发现问题是WebService服务端没有配置用户身份认证导致的,将client代码中的用户身份认证去掉接口调用OK