`

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

 
阅读更多
 
 

前言

有时候调用web service 会出现

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

这样的错误。

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

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

举例来说, 可能需要加上如下的认证头:

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <soapenv:Header>  
  2.   <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">  
  3.     <wsse:UsernameToken>  
  4.       <wsse:Username>UserName</wsse:Username>  
  5.       <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">Password</wsse:Password>  
  6.     </wsse:UsernameToken>  
  7.   </wsse:Security>  
  8. </soapenv:Header>  
(这个细部的格式和服务端的要求有关, 具体的username和pass也是服务端提供的)

在sopaui 调用的时候, 加上类似, 就能呼叫成功了。

 

 

在soapui 调用, 可以用以上方式来做。在把wsdl 转为java 后, 又该如何加上认证的头信息呢?

 

cxf 加上认证头

(以上的认证头, 比较接近cxf 的调用方式。)

如果使用的是cxf生产的客户端的代码。

(如何生成,参考 CXF 生成Web Service Client(将WSDl 转化成 Java代码)

在 _Client 调用的时候加上 如下代码:(在方法调用的代码之前)

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. Map<String, Object> props = new HashMap<String, Object>();  
  2. props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);        
  3. props.put(WSHandlerConstants.PASSWORD_TYPE,WSConstants.PW_TEXT);  
  4. props.put(WSHandlerConstants.USER, "UserName");  
  5. props.put(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName());  
  6. WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);  
  7. Client client = ClientProxy.getClient(port);  
  8. client.getOutInterceptors().add(wssOut);  

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

 

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. public static class PasswordHandler implements CallbackHandler  
  2. {  
  3.     public void handle(javax.security.auth.callback.Callback[] callbacks) {  
  4.         for (int i = 0; i < callbacks.length; i++) {  
  5.             WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];  
  6.             pc.setPassword("password");  
  7.         }  
  8.     }  
  9.   
  10. }  


 

Axis2 加上认证头

针对以上的认证头在axis2 产生的java 文件中如何添加呢(Axis2自动产生的java 文件并不会自动产生main的测试文件, 需要自己写。  XXXXProxy.java 这是供调用的类文件。 不过这些和添加认证头关系不大)

axis2会产生一个  XXXXPortBindingStub.java 的文件。 这里面的内容就是实际的方法体。

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

在方法调用之前,加入以下代码:

 

[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. //Begin add for Header  
  2.         String AUTH_PREFIX = "wsse";  
  3.         String AUTH_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";  
  4.          try{  
  5.             SOAPElement wsSecHeaderElm = soapFactory.createElement("Security", AUTH_PREFIX, AUTH_NS);          
  6.             SOAPElement userNameTokenElm = soapFactory.createElement("UsernameToken",AUTH_PREFIX, AUTH_NS);            
  7.             SOAPElement userNameElm = soapFactory.createElement("Username",AUTH_PREFIX, AUTH_NS);           
  8.             SOAPElement passwdElm = soapFactory.createElement("Password",AUTH_PREFIX, AUTH_NS);                   
  9.             passwdElm.setAttribute("Type""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");  
  10.             
  11.        userNameElm.addTextNode("vend_bmc01");  
  12.        passwdElm.addTextNode("mediatek");  
  13.               
  14.       userNameTokenElm.addChildElement(userNameElm);  
  15.       userNameTokenElm.addChildElement(passwdElm);  
  16.       wsSecHeaderElm.addChildElement(userNameTokenElm);           
  17.       SOAPHeaderElement soapHeaderElement =  new SOAPHeaderElement(wsSecHeaderElm);  
  18.       soapHeaderElement.setMustUnderstand(true);  
  19.       _call.addHeader(soapHeaderElement);    
  20.         }catch(Exception e)  
  21.         {  
  22.             e.printStackTrace();  
  23.         }          
  24.       //End add for Header  
  25.    
  26. ===》call method  
  27.        java.lang.Object _resp = _call.invoke(XXXX);  

原理很简单。 加上类似xml 的头, _call_addHeader

 

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

分享到:
评论

相关推荐

    金蝶调用Webservice接口-SOAP

    在金蝶中调用Web服务的第一步是创建服务对象。这通过`Service.create()`方法完成,传入WSDL(Web Services Description Language)URL和QName( Qualified Name)来定义服务的命名空间和本地名称。例如: ```java ...

    java调用soap接口案例

    Java调用SOAP(Simple Object Access Protocol)接口是Web服务交互中的常见操作,SOAP是一种基于XML的协议,用于在Web上交换结构化的和类型化的信息。本案例主要关注如何使用Java来实现SOAP请求并获取响应,具体我们...

    webservice Soap和XFire2种方式代码列子

    Web服务(Web Service)是一种基于互联网的标准,允许应用程序之间进行交互和数据共享。在Web服务的世界里,SOAP(Simple Object Access Protocol)和XFire是两种常见的实现方式。 **SOAP(简单对象访问协议)** ...

    模拟soapui调用webservice

    此外,如果Web服务需要身份验证,我们还需要在请求头中添加认证信息,如Basic Auth或Token。 博客文章可能还涵盖了如何解析返回的SOAP响应,这通常涉及XML解析库,如Java的JAXB或DOM,或者Python的ElementTree。...

    HttpClient 调用WebService示例

    HttpClient是Apache基金会开发的一个HTTP客户端库,广泛应用于Java开发者中,用于执行HTTP请求。它提供了丰富的功能,包括GET、POST、PUT、DELETE等... String soapRequestBody = "&lt;soapenv:Envelope xmlns:soapenv=\...

    获取手机归属地代码

    本示例将介绍如何利用SOAP(Simple Object Access Protocol)协议调用Web Service来实现这一功能。SOAP是一种基于XML的协议,用于在分布式环境中交换结构化和类型化的信息。 首先,理解SOAP协议的核心概念至关重要...

    Java Tutorial: Creating Web Services

    ### Java 教程:创建 Web 服务 #### 1. 引言 在互联网的早期阶段,Web 应用程序通过 HTML 提供静态网页。这种网站开发方式虽然简单,但静态内容很容易过时,因此网站的内容管理变得尤为重要。为了向 Web 用户提供...

    Android下调用webservice的客户端和服务器端详细代码

    在Android开发中,调用Web Service是常见的数据交互方式,特别是在需要与远程服务器进行通信时。Web Service是一种基于网络的、平台无关的接口,可以提供数据交换和业务逻辑执行。本示例提供了Android客户端和服务器...

    webservice 调用实例soap协议

    1. **创建SOAP请求**:在调用Web服务时,开发者需要构造一个符合SOAP规范的XML请求。这个请求通常包括服务的URL(WSDL地址),操作名称,以及任何必需的参数。例如,一个简单的SOAP请求可能如下所示: ```xml ...

    webservice接口的wsdl文件已经生成java代码.docx

    4. 使用Java调用Web服务: 生成的Java代码通常包含一个服务代理类(Stub),开发者可以通过这个类来调用Web服务。例如,使用CXF,可以设置服务端点(Endpoint): ```java MyWebService service = new MyWebService...

    SOAP与Java编程指南SOAP与Java编程指南

    - 生成客户端代理:使用WSDL(Web Service Description Language)文件,JAX-WS工具可以生成一个客户端代理类,这个类可以像调用本地方法一样调用远程SOAP服务。 **三、WSDL与UDDI** - **WSDL**(Web Services ...

    webservice+xml新手实例

    【Web服务(Web Service)与XML基础】 Web服务是一种基于互联网的、平台独立的交互方式,它允许不同的应用程序之间交换数据和服务。Web服务的核心技术包括简单对象访问协议(SOAP)、Web服务描述语言(WSDL)和统一...

    webservers

    " &lt;soapenv:Header/&gt;\n" + " &lt;soapenv:Body&gt;\n" + " &lt;xsd:sayHello/&gt;\n" + " &lt;/soapenv:Body&gt;\n" + "&lt;/soapenv:Envelope&gt;"; String response = client.writeMsg(soapMessage); System.out.println(response);...

    webService入门

    &lt;soapenv:Header/&gt; &lt;soapenv:Body&gt; &lt;ns:invokeService soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns="http://example.com/service"&gt; &lt;inputParam xsi:type="xsd:string"&gt;value1...

    WebService (一) CXF 入门 HelloWorld

    &lt;soapenv:Header/&gt; &lt;soapenv:Body&gt; &lt;hws:sayHello&gt; &lt;!--Optional:--&gt; &lt;arg0&gt;John Doe &lt;/hws:sayHello&gt; &lt;/soapenv:Body&gt; &lt;/soapenv:Envelope&gt; ``` ### 3. 压缩包文件内容 CXF_DEMO1压缩包可能包含以下内容:...

    Android Retrofit2+Okhttp3+Rxjava通过SOAP协议请求WebService

    在Android开发中,有时我们需要与使用SOAP(Simple Object Access Protocol)协议的Web服务进行交互。SOAP是一种基于XML的协议,用于在应用程序之间交换结构化和类型化的信息。本篇文章将详细探讨如何使用Retrofit2...

    Android 基于 Retrofit2+Okhttp3 通过SOAP协议请求WebService

    在Android开发中,与远程服务器进行数据交互是常见的需求,其中SOAP(Simple Object Access Protocol)协议是一种常用的Web Service通信标准,尤其在企业级应用中广泛使用。本教程将重点讲解如何利用Retrofit2和...

    httpclient实现webservice客户端

    WSDL(Web Service Description Language)用来定义服务的位置和如何调用服务,UDDI(Universal Description, Discovery, and Integration)则是一个用于发布和查找Web服务的目录。 HttpClient库允许开发者轻松地...

    spring +xfire整合

    6. 使用JavaScript调用Web服务:在客户端,你可以使用XMLHttpRequest对象或现代浏览器中的fetch API来发起AJAX请求,调用已发布的Web服务。由于XFire支持SOAP 1.1和1.2,因此你可以使用JavaScript库,如jQuery的`....

Global site tag (gtag.js) - Google Analytics