当前位置:首页 > 开发 > 编程语言 > Web Service > 正文

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

发表于: 2014-04-22   作者:黑龙0110   来源:转载   浏览:
摘要: 最近调试公司的webService,我用java实现客户端。在调试中遇到点困难,客户端调用服务端需要先签证,签证正确后需要将签证返回的结果保存到soap header中用于请求验证。网上找了好多,参考并不断尝试,最终搞定了。今天分享出来,希望能对有需要的朋友有帮助。我这直接就粘代码了 package com.hzsun.client; import java.util.ArrayL
最近调试公司的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 header

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
1、显示的使用soap的header传递消息(不推荐使用,会破坏正常的代码结构,推荐使用handler处理) @Web
开发需要的jar包: 服务器端代码: package com.cxf.ws.service; import javax.jws.WebService; @Web
Web Servce能解决的问题: 1、远程调用 2、跨平台调用 3、语言调用 Web Servce实际用途: 1、同意公
选框架犹如选媳妇,选来选去,最后我还是选了“丑媳妇(CXF)”,为什么是它?因为 CXF 是 Apache
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追
页面效果(还待完善) 业务功能 用户下订单(客户端)(可能是多个)把订单重组后(服务端),供客户端调用并
占坑,后续补充。。。。 首先 定义客户端调用的xml配置文件如ws-client-bean.xml 定义相关服务端的接
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本人声明。否则将追
一、CXF的介绍 Apache CXF是一个开源的WebService框架,CXF大大简化了Webservice的创建,同时它继承
Web Service,即“Web 服务”,简写为 WS。那么服务有服务需求方和提供服务方,顾名思义,提供服务
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号