最近调试公司的webService,我用java实现客户端。在调试中遇到点困难,客户端调用服务端需要先签证,签证正确后需要将签证返回的结果保存到soap header中用于请求验证。网上找了好多,参考并不断尝试,最终搞定了。今天分享出来,希望能对有需要的朋友有帮助。我这直接就粘代码了
package com.hzsun.client;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBException;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.binding.soap.interceptor.SoapPreProtocolOutInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.phase.Phase;
import com.hzsun.SecurityHeader;
public class AddSoapSecurityHeader extends AbstractSoapInterceptor {
/**
*
* @Title:在发送消息前,封装Soap Header 信息
*
* @Description:
*
* @Copyright:
*
* @author zz
* @version 1.00.000
*
*/
public AddSoapSecurityHeader() {
super(Phase.WRITE);
addAfter(SoapPreProtocolOutInterceptor.class.getName());
}
private SecurityHeader securityHeader;
public void handleMessage(SoapMessage message) throws Fault {
System.out.println("AddSoapSecurityHeader handleMessage invoked");
List<Header> headers = new ArrayList<Header>();
try {
Header dummyHeader = new Header(new QName("http://www.hzsun.com/",
"SecurityHeader"), securityHeader, new JAXBDataBinding(
SecurityHeader.class));
headers.add(dummyHeader);
message.put(Header.HEADER_LIST, headers);
} catch (JAXBException e) {
e.printStackTrace();
}
}
public SecurityHeader getSecurityHeader() {
return securityHeader;
}
public void setSecurityHeader(SecurityHeader securityHeader) {
this.securityHeader = securityHeader;
}
}
客户端调用
import javax.xml.namespace.QName;
import org.apache.cxf.frontend.ClientProxy;
import com.hzsun.SecurityHeader;
import com.hzsun.ThirdWebservice;
import com.hzsun.ThirdWebserviceSoap;
import com.hzsun.client.AddSoapSecurityHeader;
public class Client {
private static final QName SERVICE_NAME = new QName(
"http://www.hzsun.com/", "ThirdWebservice");
/**
* @param args
*/
public static void main(String[] args) {
ThirdWebservice ss = new ThirdWebservice(ThirdWebservice.WSDL_LOCATION,
SERVICE_NAME);
ThirdWebserviceSoap port = ss.getThirdWebserviceSoap();
System.out.println("Invoking signIn...");
javax.xml.ws.Holder<java.lang.String> _signIn_signInResult = new javax.xml.ws.Holder<java.lang.String>();
javax.xml.ws.Holder<java.lang.Integer> _signIn_stanum = new javax.xml.ws.Holder<java.lang.Integer>();
javax.xml.ws.Holder<java.lang.Integer> _signIn_thirdType = new javax.xml.ws.Holder<java.lang.Integer>();
javax.xml.ws.Holder<java.lang.Integer> _signIn_secret1 = new javax.xml.ws.Holder<java.lang.Integer>();
javax.xml.ws.Holder<java.lang.String> _signIn_secret2 = new javax.xml.ws.Holder<java.lang.String>();
port.signIn(_signIn_signInResult, _signIn_stanum, _signIn_thirdType,
_signIn_secret1, _signIn_secret2);
System.out.println("signIn._signIn_signInResult="
+ _signIn_signInResult.value);
System.out.println("signIn._signIn_stanum=" + _signIn_stanum.value);
System.out.println("signIn._signIn_thirdType="
+ _signIn_thirdType.value);
System.out.println("signIn._signIn_secret1=" + _signIn_secret1.value);
System.out.println("signIn._signIn_secret2=" + _signIn_secret2.value);
SecurityHeader securityHeader = new SecurityHeader();
securityHeader.setSecret1(_signIn_secret1.value);
securityHeader.setSecret2(_signIn_secret2.value);
securityHeader.setThirdType(_signIn_thirdType.value);
//在这调用
AddSoapSecurityHeader soapSecurityHeader = new AddSoapSecurityHeader();
//传了一个对象参数,有服务端决定
soapSecurityHeader.setSecurityHeader(securityHeader);
org.apache.cxf.endpoint.Client cxfClient = ClientProxy.getClient(port);
cxfClient.getOutInterceptors().add(soapSecurityHeader);
}
}
分享到:
相关推荐
对于SOAP 1.1,`@WebMethod`的`soapAction`属性通常用于设置SOAP Header中的SOAPAction值。 4. **@WebParam**:用于标记方法参数,`name`属性对应于WSDL中的参数名称,`partName`属性用于描述`wsdl:part`。此注解...
在CXF中,动态地址客户端是指能够根据运行时的信息(如服务器地址、端口等)动态改变服务调用目标的能力。这种功能在分布式系统和云环境中非常有用,因为服务的IP或端口可能会发生变化。 以下是对CXF Webservice...
- 在实际开发中,建议使用成熟的SOAP客户端库,如Apache CXF或Spring WS,以简化SOAP通信的过程。 - 本例中的XML文件`QQOnlineService.XML`应该被替换为获取天气预报所需的正确XML格式。 - 代码中使用的URL与实际...
它简化了使用SOAP开发Web服务的过程,提供了从CXF下载、安装到开发和发布Web服务的详细指导。 8. **SOAP与HTTP绑定** SOAP1.1规范中定义了基于HTTP的绑定方式,通过HTTP的POST请求携带SOAP消息内容,使用`SOAP...
总之,使用CXF框架在SOAP协议下开发Web服务,不仅可以享受到Java语言的强大功能,还能充分利用CXF提供的便利性和灵活性。通过深入学习和实践,开发者可以高效地构建跨平台、安全可靠的分布式系统。
【标题】"CXF-SOAP搭建WebService服务端demo"主要涵盖了使用Apache CXF框架、Spring框架、Maven构建工具以及SOAP协议来创建一个Web服务端的实例。这个过程涉及了多个关键知识点,下面将详细阐述。 【SOAP】:简单...
对于Java开发者,可以使用Apache CXF或JAX-WS来实现SOAP调用,代码中会定义服务接口并创建客户端代理。对于RESTful API,可以使用JAX-RS(如Jersey)或Spring MVC来实现。这些框架提供了方便的API,简化了请求的构建...
总的来说,"WebService客户端调用服务器数据库"涉及到的技术点包括WebService的基本概念、通信协议、服务描述语言以及客户端调用的实现。理解并掌握这些知识点,对于构建可扩展、跨平台的分布式系统至关重要。在具体...
【标题解析】 ...这个项目提供了从设计、实现到测试Web服务的完整示例,对于学习和理解CXF、Spring、MyBatis和Maven的集成,以及如何在Web服务中实现自定义拦截器和安全验证机制,具有很高的参考价值。
通过阅读提供的"java-soap-webservice"文档,你可以进一步了解具体的实现步骤,包括如何设置项目、配置JAX-WS、生成客户端代码、编写调用服务的代码,以及如何解析响应。实践中,不断动手操作和调试是掌握这一技术的...
以Java为例,可以使用Apache CXF库创建SOAP客户端,首先通过WSDL生成服务代理类,然后实例化并调用服务方法。这涉及到JAXB(Java Architecture for XML Binding)用于对象到XML的转换。 8. **性能和优化** SOAP的...
- soap消息格式:SOAP是WebService的消息格式,定义了消息的结构,包括头部(header)和主体(body)部分。 - 输入输出参数的注解:在JAX-WS中,使用注解来声明服务方法的输入输出参数,使得服务的开发更加直观。 ...
总的来说,理解WebService的基本原理,熟悉Java中的相关工具,以及正确配置和使用这些工具,是成功实现Java客户端调用WebService的关键。这个过程中,文档如"Webservice服务使用手册.doc"将提供详细指导,帮助你更好...
这个实例将探讨WebService在服务端和客户端的实现,帮助我们理解如何通过XML、SOAP(简单对象访问协议)和WSDL(Web服务描述语言)进行数据交换。 1. **WebService基础** WebService的核心思想是利用互联网协议...
运行应用,然后可以通过CXF提供的测试客户端或者使用任何SOAP客户端(如SoapUI)调用服务: ```xml <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hws=...
使用CXF,开发者可以方便地创建和部署WebService服务端,同时,CXF还提供了创建客户端的能力,可以直接通过HTTP POST方式调用服务端。 总结来说,WebService是一种重要的集成工具,它通过标准化的数据交换和HTTP...
这样,你可以在接收到请求时检查SOAP Header中的身份验证信息,确保只有授权的用户才能访问Web服务。 2. **WS-Security身份验证**: WS-Security(Web Services Security)是OASIS标准,用于提供Web服务的安全性,...
综上所述,"webservice Soap和XFire2种方式代码列子"的压缩包可能包含使用SOAP协议和XFire框架创建Web服务的示例代码。通过学习这些代码,开发者可以更好地理解如何在Java环境中构建和消费SOAP服务,以及XFire在其中...