我需要调用需要安全标头认证的SOAP 4.0 Web服务(基于Web服务指南https://kupdf.net/download/soap-4-0-amadeus-wbs-implementation-guide_58c657a8dc0d605613339031_pdf)。不幸的是,在我的JAVA代码中,我目前陷入了密码参数步骤-这给了我
异常2019-02-25 19:06:36错误ExceptionHandler:36-客户端调试: 11 |会话| org.apache.cxf.binding.soap.SoapFault:11 |会话|在 org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:86) 在 org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:52) 在 org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:41) 在 org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) 在 org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:112) 在 org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69) 在 org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34) 在 org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) 在org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:798) 在 org.apache.cxf.transport.http.HTTPConduit $ WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1653) 在 org.apache.cxf.transport.http.HTTPConduit $ WrappedOutputStream.handleResponse(HTTPConduit.java:1533) 在 org.apache.cxf.transport.http.HTTPConduit $ WrappedOutputStream.close(HTTPConduit.java:1330) 在 java.util.zip.DeflaterOutputStream.close(DeflaterOutputStream.java:241) 在 org.apache.cxf.io.AbstractWrappedOutputStream.close(AbstractWrappedOutputStream.java:77) 在 org.apache.cxf.io.AbstractThresholdOutputStream.close(AbstractThresholdOutputStream.java:102) 在 org.apache.cxf.io.CacheAndWriteOutputStream.postClose(CacheAndWriteOutputStream.java:56) 在 org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:215) 在 org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 在 org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:652) 在 org.apache.cxf.interceptor.MessageSenderInterceptor $ MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) 在 org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308) 在org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:514) 在org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:423)处 org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:324)在 org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:277)在 org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:297)在 org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:283)在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)在 org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:119) 在com.sun.proxy。$ Proxy48.invoke(未知来源) com.dlh.zambas.mw.client.ServiceProxy.callService(ServiceProxy.java:230) 在 com.dlh.zambas.mw.client.ServiceProxy.invoke(ServiceProxy.java:114)
ERROR ExceptionHandler:39-客户端调试:空
密码参数需要密码摘要生成算法,其格式为:
Base64(SHA1($NONCE + $TIMESTAMP + SHA1($CLEARPASSWORD)))
其中:
Base64
是一种二进制文本编码方案;
SHA1
是一种加密哈希函数;
+
是串联函数;
$NONCE
是客户端应用程序生成的输入参数;
$TIMESTAMP
是代表当前时间戳的输入参数;
$CLEARPASSWORD
是输入参数-原始密码。
下面是我正在尝试的代码段:
private String buildPasswordDigest(String nonce, String timestamp, String pass) {
nonce=generateNonce();
timestamp=generateTimestamp();
pass="Test"
try
{
MessageDigest msdDigest = MessageDigest.getInstance("SHA-1");
msdDigest.update(pass.getBytes("UTF-8"), 0, pass.length());
sha1_pass = byteToHex(msdDigest.digest());
msdDigest.reset();
String input_sha1= nonce+timestamp+sha1_pass;
msdDigest.update(input_sha1.getBytes("UTF-8"), 0, input_sha1.length());
return Base64.encodeBase64String(msdDigest.digest());
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return passwordDigest;
}
private static String byteToHex(final byte[] hash){
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
private String generateNonce() {
String dateTimeString = Long.toString(new Date().getTime());
byte[] nonceByte = dateTimeString.getBytes();
return Base64.encodeBase64String(nonceByte);
}
private String generateTimestamp() {
DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date today = Calendar.getInstance().getTime();
return dateFormatter.format(today);
}
是否不符合格式?