Java 调用Web service 加入认证头(soapenv:Header)

前言

有时候调用web service 会出现

Message does not conform to configured policy [ AuthenticationTokenPolicy(S) ]:  No Security Header found

这种错误。

以在 soapui 调用的结果来看, 会出现例如以下的返回

出现这种错误的原因 是webservice 的服务端须要提供 soap 认证的表头。

举例来说。 可能须要加上例如以下的认证头:

        <soapenv:Header>
          <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
            <wsse:UsernameToken>
              <wsse:Username>UserName</wsse:Username>
              <wsse:Password Type="http://docs.oasis-open.org/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 的调用方式。

)

假设使用的是cxf生产的客户端的代码。

(怎样生成,參考 CXF 生成Web Service Client(将WSDl 转化成 Java代码)

在 _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, PasswordHandler.class.getName());
	    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);
	    Client client = ClientProxy.getClient(port);
	    client.getOutInterceptors().add(wssOut);

在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 加上认证头

针对以上的认证头在axis2 产生的java 文件里怎样加入呢(Axis2自己主动产生的java 文件并不会自己主动产生main的測试文件, 须要自己写。  XXXXProxy.java 这是供调用的类文件。 只是这些和加入认证头关系不大)

axis2会产生一个  XXXXPortBindingStub.java 的文件。

这里面的内容就是实际的方法体。

找到我们须要调用的那个方法体:

在方法调用之前。加入下面代码:

//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);

原理非常easy。 加上相似xml 的头, _call_addHeader

加上之后。再触发方法 _call.invoke

时间: 2024-10-12 09:16:00

Java 调用Web service 加入认证头(soapenv:Header)的相关文章

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

前言 有时候调用web service 会出现 Message does not conform to configured policy [ AuthenticationTokenPolicy(S) ]:  No Security Header found 这样的错误. 以在 soapui 调用的结果来看, 会出现如下的返回 出现这种错误的原因 是webservice 的服务端需要提供 soap 认证的表头. 举例来说, 可能需要加上如下的认证头: <soapenv:Header> <

JAVA 调用Web Service的方法(转载)

JAVA 调用Web Service的方法 1.使用HttpClient 用到的jar文件:commons-httpclient-3.1.jar 方法: 预先定义好Soap请求数据,可以借助于XMLSpy Professional软件来做这一步生成. String soapRequestData = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +     "<soap12:

java axis web service

编写 java调用web service的客户端比较简单,其中webservice为上一篇gsoap创建的server. 1 package clientTest; 2 import java.rmi.RemoteException; 3 4 import javax.xml.namespace.QName; 5 import javax.xml.rpc.ServiceException; 6 import javax.xml.rpc.ParameterMode; 7 import javax.

Java实现与调用Web Service

一. Web Service 1. web service 就是应用程序之间跨语言的调用 例如,天气预报Web Service:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 2. wsdl: web service description language(web服务描述语言) 通过xml格式说明调用的地址方法如何调用,可以看作webservice的说明书 例如,天气预报的:http://www.webxml.com.cn

ORACLE存储过程调用Web Service

1. 概述 最近在ESB项目中,客户在各个系统之间的服务调用大多都是在oracle存储过程中进行的,本文就oracle存储过程调用web service来进行说明.其他主流数据库,比如mysql和sql service,调用web service的方法这里就不做介绍了,本文主要用来介绍oracle存储过程调用Web Service的方法. 众所周知,在Web Service通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明

php5调用web service

工作中需要用php调用web service接口,对php不熟,上网搜搜,发现关于用php调用web service的文章也不多,不少还是php4里用nusoap这个模块调用的方法,其实php5里已经包含了处理soap的模块,但是资料太少了,上php官网上查帮助,写的不是很容易理解,经过多次实践,终于搞清楚了,php调用web service还是非常简单的.下面用一个例子说明: extension=php_openssl.dll extension=php_soap.dll php.ini 这2

php5调用web service (笔者测试成功)

转自:http://www.cnblogs.com/smallmuda/archive/2010/10/12/1848700.html 感谢作者分享 工作中需要用php调用web service接口,对php不熟,上网搜搜,发现关于用php调用web service的文章也不多,不少还是php4里用nusoap这个模块调用的方法,其实php5里已经包含了处理soap的模块,但是资料太少了,上php官网上查帮助,写的不是很容易理解,经过多次实践,终于搞清楚了,php调用web service还是非

C#调用Web Service时的身份验证

在项目开发,我们经常会使用WebService,但在使用WebService时我们经常会考虑以下问题:怎么防止别人访问我的WebService?从哪里引用我的WebService?对于第一个问题,就涉及到了WebService是安全问题,因为我们提供的WebService不是允许所有人能引用 的,可能只允许本公司或者是通过授权的人才能使用的.那怎么防止非法用户访问呢?很容易想到通过一组用户名与密码来防止非法用户的调用 .       在System.Net中提供了一个NetworkCredent

C#使用SOAP调用Web Service

程序代码 using System;using System.IO;using System.Net;using System.Text; namespace ConsoleApplication1{ class Program    { static void Main(string[] args)        {            //构造soap请求信息            StringBuilder soap = new StringBuilder();            s