Java调⽤Webservice加⼊认证头(soapenv:Header)
有时候调⽤web service 会出现
Message does not conform to configured policy [ AuthenticationTokenPolicy(S) ]:  No Security Header found
这种错误。
以在 soapui 调⽤的结果来看,会出现例如以下的返回调用webservice服务
出现这种错误的原因是webservice 的服务端须要提供 soap 认证的表头。
举例来说。可能须要加上例如以下的认证头:
<soapenv:Header>
<wsse:Security xmlns:wsse="/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
<wsse:UsernameToken>
<wsse:Username>UserName</wsse:Username>
<wsse:Password Type="/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Password</wsse:Password>            </wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
(这个细部的格式和服务端的要求有关,详细的username和pass也是服务端提供的)
在sopaui 调⽤的时候,加上相似,就能呼叫成功了。
在soapui 调⽤,能够⽤以上⽅式来做。
在把wsdl 转为java 后。⼜该怎样加上认证的头信息呢?
(以上的认证头。⽐較接近cxf 的调⽤⽅式。
)
假设使⽤的是cxf⽣产的客户端的代码。
(怎样⽣成,參考)
在 _Client 调⽤的时候加上例如以下代码:(在⽅法调⽤的代码之前)
Map<String, Object> props = new HashMap<String, Object>();
props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
props.put(WSHandlerConstants.PASSWORD_TYPE,WSConstants.PW_TEXT);
props.put(WSHandlerConstants.USER, "UserName");
props.put(WSHandlerConstants.PW_CALLBACK_CLASS, Name());
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);
Client client = Client(port);
在client 的java ⽂件⾥,新增下⾯内部类
public static class PasswordHandler implements CallbackHandler
{
public void handle(javax.security.auth.callback.Callback[] callbacks) {
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
pc.setPassword("password");
}
}
}
针对以上的认证头在axis2 产⽣的java ⽂件⾥怎样加⼊呢(Axis2⾃⼰主动产⽣的java ⽂件并不会⾃⼰主动产⽣main的測试⽂件,须要⾃⼰写。  XXXXProxy.java 这是供调⽤的类⽂件。只是这些和加⼊认证头关系不⼤)
axis2会产⽣⼀个  XXXXPortBindingStub.java 的⽂件。
这⾥⾯的内容就是实际的⽅法体。
到我们须要调⽤的那个⽅法体:
在⽅法调⽤之前。加⼊下⾯代码:
//Begin add for Header
String AUTH_PREFIX = "wsse";
String AUTH_NS = "/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
try{
SOAPElement wsSecHeaderElm = ateElement("Security", AUTH_PREFIX, AUTH_NS);
SOAPElement userNameTokenElm = ateElement("UsernameToken",AUTH_PREFIX,
AUTH_NS);
SOAPElement userNameElm = ateElement("Username",AUTH_PREFIX, AUTH_NS);
SOAPElement passwdElm = ateElement("Password",AUTH_PREFIX, AUTH_NS);
passwdElm.setAttribute("Type", "/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
userNameElm.addTextNode("vend_bmc01");
passwdElm.addTextNode("mediatek");
userNameTokenElm.addChildElement(userNameElm);
userNameTokenElm.addChildElement(passwdElm);
wsSecHeaderElm.addChildElement(userNameTokenElm);
SOAPHeaderElement soapHeaderElement =  new SOAPHeaderElement(wsSecHeaderElm);
soapHeaderElement.setMustUnderstand(true);
_call.addHeader(soapHeaderElement);
}catch(Exception e)
{
e.printStackTrace();
}
//End add for Header
===》call method
java.lang.Object _resp = _call.invoke(XXXX);
原理⾮常easy。加上相似xml 的头, _call_addHeader
加上之后。再触发⽅法 _call.invoke

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。