java soapheader_Java 调用Web service 添加认证头(soapenv:Header)

何骞尧
2023-12-01

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[-]前言cxf 加上认证头Axis2 加上认证头 前言有时候调用web service 会出现Message does not conform to configured policy [ AuthenticationTokenPolicy(S) ]:

No Security Header found 这样的错误。以在 soapui 调用的结果来看, 会出现如下的返回出现这种错误的原因 是webservice 的服务端需要提供 soap 认证的表头。举例来说, 可能需要加上如下的认证头: [html] view plaincopy 

UserName

Password

(这个细部的格式和服务端的要求有关, 具体的username和pass也是服务端提供的)在sopaui 调用的时候, 加上类似, 就能呼叫成功了。

在soapui 调用, 可以用以上方式来做。在把wsdl 转为java 后, 又该如何加上认证的头信息呢? cxf 加上认证头(以上的认证头, 比较接近cxf 的调用方式。)如果使用的是cxf生产的客户端的代码。(如何生成,参考 CXF 生成Web Service Client(将WSDl 转化成 Java代码))在 _Client 调用的时候加上 如下代码:(在方法调用的代码之前) [java] view plaincopy Map props = new HashMap();

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, PasswordHandler.class.getName());

WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);

Client client = ClientProxy.getClient(port);

client.getOutInterceptors().add(wssOut);

在client 的java 文件中, 新增以下内部类

[java] view plaincopy public static class PasswordHandler implements CallbackHandler

{

public void handle(javax.security.auth.callback.Callback[] callbacks) {

for (int i = 0; i 

WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];

pc.setPassword("password");

}

}

}

Axis2 加上认证头针对以上的认证头在axis2 产生的java 文件中如何添加呢(Axis2自动产生的java 文件并不会自动产生main的测试文件, 需要自己写。

XXXXProxy.java 这是供调用的类文件。 不过这些和添加认证头关系不大)axis2会产生一个

XXXXPortBindingStub.java 的文件。 这里面的内容就是实际的方法体。找到我们需要调用的那个方法体:在方法调用之前,加入以下代码: [java] view plaincopy //Begin add for Header

String AUTH_PREFIX = "wsse";

String AUTH_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";

try{

SOAPElement wsSecHeaderElm = soapFactory.createElement("Security", AUTH_PREFIX, AUTH_NS);

SOAPElement userNameTokenElm = soapFactory.createElement("UsernameToken",AUTH_PREFIX, AUTH_NS);

SOAPElement userNameElm = soapFactory.createElement("Username",AUTH_PREFIX, AUTH_NS);

SOAPElement passwdElm = soapFactory.createElement("Password",AUTH_PREFIX, AUTH_NS);

passwdElm.setAttribute("Type", "http://docs.oasis-open.org/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);

原理很简单。 加上类似xml 的头, _call_addHeader 加上之后,再触发方法 _call.invoke

 类似资料: