`

使用cxf实现webService,客户端填写信息到soap header

阅读更多
最近调试公司的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);

		
	}

}
分享到:
评论

相关推荐

    使用CXF开发WebService

    对于SOAP 1.1,`@WebMethod`的`soapAction`属性通常用于设置SOAP Header中的SOAPAction值。 4. **@WebParam**:用于标记方法参数,`name`属性对应于WSDL中的参数名称,`partName`属性用于描述`wsdl:part`。此注解...

    CXF webservice 动态地址客户端相关代码和jar包

    在CXF中,动态地址客户端是指能够根据运行时的信息(如服务器地址、端口等)动态改变服务调用目标的能力。这种功能在分布式系统和云环境中非常有用,因为服务的IP或端口可能会发生变化。 以下是对CXF Webservice...

    Java使用SOAP获取webservice实例解析

    - 在实际开发中,建议使用成熟的SOAP客户端库,如Apache CXF或Spring WS,以简化SOAP通信的过程。 - 本例中的XML文件`QQOnlineService.XML`应该被替换为获取天气预报所需的正确XML格式。 - 代码中使用的URL与实际...

    第16讲-SOAP与CXF开发WebService.pptx

    它简化了使用SOAP开发Web服务的过程,提供了从CXF下载、安装到开发和发布Web服务的详细指导。 8. **SOAP与HTTP绑定** SOAP1.1规范中定义了基于HTTP的绑定方式,通过HTTP的POST请求携带SOAP消息内容,使用`SOAP...

    基于Soap协议下CXF框架开发Webservice

    总之,使用CXF框架在SOAP协议下开发Web服务,不仅可以享受到Java语言的强大功能,还能充分利用CXF提供的便利性和灵活性。通过深入学习和实践,开发者可以高效地构建跨平台、安全可靠的分布式系统。

    CXF-SOAP搭建WebService服务端demo

    【标题】"CXF-SOAP搭建WebService服务端demo"主要涵盖了使用Apache CXF框架、Spring框架、Maven构建工具以及SOAP协议来创建一个Web服务端的实例。这个过程涉及了多个关键知识点,下面将详细阐述。 【SOAP】:简单...

    WebService的两种客户端调用方式

    对于Java开发者,可以使用Apache CXF或JAX-WS来实现SOAP调用,代码中会定义服务接口并创建客户端代理。对于RESTful API,可以使用JAX-RS(如Jersey)或Spring MVC来实现。这些框架提供了方便的API,简化了请求的构建...

    WebService客户端调用服务器数据库

    总的来说,"WebService客户端调用服务器数据库"涉及到的技术点包括WebService的基本概念、通信协议、服务描述语言以及客户端调用的实现。理解并掌握这些知识点,对于构建可扩展、跨平台的分布式系统至关重要。在具体...

    CXF3.1.16 +Spring4 +MyBatis + Maven自定义拦截器 WebService实例源码下载

    【标题解析】 ...这个项目提供了从设计、实现到测试Web服务的完整示例,对于学习和理解CXF、Spring、MyBatis和Maven的集成,以及如何在Web服务中实现自定义拦截器和安全验证机制,具有很高的参考价值。

    java+soap+webservice 调用模拟

    通过阅读提供的"java-soap-webservice"文档,你可以进一步了解具体的实现步骤,包括如何设置项目、配置JAX-WS、生成客户端代码、编写调用服务的代码,以及如何解析响应。实践中,不断动手操作和调试是掌握这一技术的...

    Soap方式调用WebService

    以Java为例,可以使用Apache CXF库创建SOAP客户端,首先通过WSDL生成服务代理类,然后实例化并调用服务方法。这涉及到JAXB(Java Architecture for XML Binding)用于对象到XML的转换。 8. **性能和优化** SOAP的...

    Webservice-CXF实用手册学习大全

    - soap消息格式:SOAP是WebService的消息格式,定义了消息的结构,包括头部(header)和主体(body)部分。 - 输入输出参数的注解:在JAX-WS中,使用注解来声明服务方法的输入输出参数,使得服务的开发更加直观。 ...

    webservice在java中客户端调用

    总的来说,理解WebService的基本原理,熟悉Java中的相关工具,以及正确配置和使用这些工具,是成功实现Java客户端调用WebService的关键。这个过程中,文档如"Webservice服务使用手册.doc"将提供详细指导,帮助你更好...

    webservice服务端及客户端实例

    这个实例将探讨WebService在服务端和客户端的实现,帮助我们理解如何通过XML、SOAP(简单对象访问协议)和WSDL(Web服务描述语言)进行数据交换。 1. **WebService基础** WebService的核心思想是利用互联网协议...

    WebService (一) CXF 入门 HelloWorld

    运行应用,然后可以通过CXF提供的测试客户端或者使用任何SOAP客户端(如SoapUI)调用服务: ```xml &lt;soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hws=...

    深入浅出WebService

    使用CXF,开发者可以方便地创建和部署WebService服务端,同时,CXF还提供了创建客户端的能力,可以直接通过HTTP POST方式调用服务端。 总结来说,WebService是一种重要的集成工具,它通过标准化的数据交换和HTTP...

    使用xfire框架搭建webService的一个demo

    这样,你可以在接收到请求时检查SOAP Header中的身份验证信息,确保只有授权的用户才能访问Web服务。 2. **WS-Security身份验证**: WS-Security(Web Services Security)是OASIS标准,用于提供Web服务的安全性,...

    webservice Soap和XFire2种方式代码列子

    综上所述,"webservice Soap和XFire2种方式代码列子"的压缩包可能包含使用SOAP协议和XFire框架创建Web服务的示例代码。通过学习这些代码,开发者可以更好地理解如何在Java环境中构建和消费SOAP服务,以及XFire在其中...

Global site tag (gtag.js) - Google Analytics