`
schy_hqh
  • 浏览: 558464 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(二)CXF使用HANDLER处理头信息

 
阅读更多

使用CXF可以很方便的在客户端使用Handler增加头信息,只需在调用服务前设置到proxyBean中即可;

在服务端也可以很方便的使用Handler来解析头信息,只需要在开启服务前设置到factoryBean中即可;

 

服务端:

POM.XML

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.hqh.ws.cxf</groupId>
	<artifactId>cxf-first</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>cxf-first</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<cxf.version>2.6.0</cxf.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.10</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxws</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<!-- Jetty is needed if you're are not using the CXFServlet -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http-jetty</artifactId>
			<version>${cxf.version}</version>
		</dependency>
	</dependencies>

</project>

 

接口

package com.hqh.ws.cxf;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService
public interface IMyService {

	@WebMethod
	@WebResult(name="sayResult")
	public String sayHello(@WebParam(name="name") String name);
}

 

实现类

package com.hqh.ws.cxf;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(endpointInterface="com.hqh.ws.cxf.IMyService")
public class MyServiceImpl implements IMyService {

	@Override
	@WebMethod
	public String sayHello(String name) {
		return  "你好:"+name ;
	}

}

 

解析头信息的Handler

package com.hqh.ws.cxf.handler;

import java.util.Iterator;
import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPHeaderElement;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class LicenseHandler implements SOAPHandler<SOAPMessageContext> {

	@Override
	public boolean handleMessage(SOAPMessageContext context) {
		boolean out = (Boolean)context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY);
		try {
			//进入的消息,则检查HEADER
			if(!out) {
				SOAPEnvelope env = context.getMessage().getSOAPPart().getEnvelope();
				SOAPHeader header = env.getHeader();
				SOAPBody body = env.getBody();
				if(header == null) {
					return true;
				}
				//Iterator<SOAPHeaderElement> iter = header.getChildElements();
				Iterator<SOAPHeaderElement> iter = header.extractAllHeaderElements();
				String license = "";
				while(iter.hasNext()) {
					SOAPHeaderElement headerEle = iter.next();
					if(headerEle.getLocalName().equals("license")) {
						license = headerEle.getTextContent();
						System.out.println("获取到头信息:"+license);
						break;
					}
				}
				System.out.println(license);
			}
		} catch (SOAPException e) {
			e.printStackTrace();
		}
		return true;
	}

	@Override
	public boolean handleFault(SOAPMessageContext context) {
		return false;
	}

	@Override
	public void close(MessageContext context) {
		
	}

	@Override
	public Set<QName> getHeaders() {
		return null;
	}

}

 

开启服务

package com.hqh.ws.cxf;

import java.util.ArrayList;
import java.util.List;

import javax.xml.ws.Endpoint;
import javax.xml.ws.handler.Handler;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import com.hqh.ws.cxf.handler.LicenseHandler;

public class MyServer {

	public static void main(String[] args) {
		//startServer();
		startServerByCXF(); 
	}
	/**
	 * 基于JAX-WS的方式发布服务
	 * @param args
	 */
	public static void startServer() {
		Endpoint.publish("http://localhost:8888/cxf/ws", new MyServiceImpl());
	}
	
	/**
	 * 使用CXF发布服务
	 */
	public static void startServerByCXF() {
		JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
		svrFactory.setServiceClass(IMyService.class);
		svrFactory.setAddress("http://localhost:8888/cxf/ws");
		svrFactory.setServiceBean(new MyServiceImpl());
		//打印发出的消息
		svrFactory.getInInterceptors().add(new LoggingInInterceptor());
		//打印进入的消息
		svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());
		
		/**
		 * 加入服务端的Handler处理客户端传递的头信息
		 */
		List<Handler> handlers = new ArrayList<Handler>();
		handlers.add(new LicenseHandler());
		svrFactory.setHandlers(handlers);
		
		svrFactory.create();
	}
}

 

 

 

客户端:

POM.XML

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.hqh.ws.cxf</groupId>
  <artifactId>cxf-client</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>cxf-client</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <cxf.version>2.6.0</cxf.version>
  </properties>

	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.10</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxws</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>${cxf.version}</version>
		</dependency>
	</dependencies>
  
  	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.cxf</groupId>
				<artifactId>cxf-codegen-plugin</artifactId>
				<version>${cxf.version}</version>
				<executions>
					<execution>
						<id>generate-sources</id>
						<phase>generate-sources</phase>
						<configuration>
							<sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
							<wsdlOptions>
								<wsdlOption>
									<wsdl>http://localhost:8888/cxf/ws?wsdl</wsdl>
								</wsdlOption>
							</wsdlOptions>
						</configuration>
						<goals>
							<goal>wsdl2java</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

 

通过wsdl2java转换wsdl为本地java文件

 

通过Handler加入头信息

package com.hqh.ws.cxf.handler;

import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;


public class LicenseHandler implements SOAPHandler<SOAPMessageContext> {

	@Override
	public boolean handleMessage(SOAPMessageContext context) {
		try {
			boolean out = (Boolean)context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY);
			//发送消息则加入头信息
			if(out) {
				SOAPEnvelope soapEnv = context.getMessage().getSOAPPart().getEnvelope();
				SOAPBody soapBody = soapEnv.getBody();
				//获取当前访问服务的哪个方法
				String localName = soapBody.getChildNodes().item(0).getLocalName();
				//指定对哪些方法需要加入头信息
				if(localName != "") {
					System.out.println("当前调用的方法:"+localName);
					SOAPHeader soapHeader = soapEnv.getHeader();
					if(soapHeader==null) {
						soapHeader = soapEnv.addHeader();
					}
					//创建QName
					String namespaceURI = "http://ws.cxf.hqh.com";
					String localPart = "license";
					String prefix = "nn";
					QName qname = new QName(namespaceURI,localPart,prefix);
					//加入消息到HEADER中
					soapHeader.addHeaderElement(qname).setValue("EJ8923D");
				}
			}
			return true;
		} catch (SOAPException e) {
			e.printStackTrace();
		}
		return false;
	}

	@Override
	public boolean handleFault(SOAPMessageContext context) {
		return false;
	}

	@Override
	public void close(MessageContext context) {
		
	}

	@Override
	public Set<QName> getHeaders() {
		return null;
	}

}

 

测试单元

@Test
	public void test02() {
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(IMyService.class);
		factory.setAddress("http://localhost:8888/cxf/ws?wsdl");
		//打印发出的消息
		factory.getInInterceptors().add(new LoggingInInterceptor());
		//打印进入的消息
		factory.getOutInterceptors().add(new LoggingOutInterceptor());
		
		/**
		 * 加入HANDLER
		 */
		List<Handler> licenseHandlerList = new ArrayList<Handler>();
		licenseHandlerList.add(new LicenseHandler());
		factory.setHandlers(licenseHandlerList);
		
		//获取服务对象
		IMyService service = (IMyService)factory.create();
		//调用服务
		String reply = service.sayHello("李思思");
		
		System.out.println(reply);
		System.exit(0);
	}

 

 

分享到:
评论

相关推荐

    CXF客户端添加soapHeader代码 + jar包 + apache-cxf-3.1.15

    在开发基于SOAP协议的服务时,有时我们需要在请求中添加特定的Header信息,这在CXF框架下可以通过编程方式实现。Apache CXF是一个流行的开源服务框架,支持SOAP和RESTful服务的开发、部署和消费。本示例将详细介绍...

    CXF3.0+Spring3.2 自定义拦截器

    1. **CXF拦截器基础**:CXF的拦截器是基于JAX-WS规范的Handler Chain模型,分为In-bound(请求进来时触发)和Out-bound(响应出去时触发)两类。拦截器可以通过在服务配置中指定,或者通过编程方式动态添加。 2. **...

    cxf经典学习资料-2

    1. **CXF基础**:介绍CXF的基本概念,如服务端点(Endpoint)、客户端代理(Client Proxy)、数据绑定(Data Binding)和消息处理模型。 2. **SOAP与RESTful**:讲解如何使用CXF创建和消费SOAP Web服务,以及如何...

    cxf超时设置

    "cxf超时设置"这个主题是关于如何在使用CXF框架时,对网络通信的超时时间进行配置,以优化服务的稳定性和性能。 首先,理解超时的概念至关重要。在计算机网络中,超时是指等待某个操作完成的时间限制。当这个时间...

    android_ksoap2_cxf_wss4j_authentication

    本文将深入探讨如何使用Ksoap2在Android客户端实现与使用Apache CXF和WSS4J安全框架的Web服务的认证过程。 **Ksoap2库** Ksoap2是一个轻量级的开源库,专门用于Android平台,它允许Android应用通过HTTP/HTTPS协议...

    CXF2.6 spring 提供rest服务输出xml或json等格式数据

    本文将详细探讨如何使用CXF 2.6版本与Spring框架结合,来提供REST服务并输出XML或JSON格式的数据。 首先,我们需要理解CXF的核心概念。CXF全称是Camel eXtended for Web Services,它提供了全面的Web服务实现,包括...

    cxf客户端(对象,上传与下载文件支持断点传输)

    本示例着重于CXF客户端如何处理对象参数传递以及支持文件的上传和下载,特别是实现了断点续传功能,这在大文件传输时尤为关键。 【对象传参】: CXF允许通过JAXB(Java Architecture for XML Binding)将Java对象...

    webservice,cxf

    拦截器是基于JAX-WS规范的Handler链,开发者可以通过编写自定义的Handler类并将其注册到CXF中,实现对服务请求和响应的透明处理。 最后,"lib"目录下的jar包包含了所有必要的依赖,这些库文件涵盖了CXF、Spring以及...

    CXF跟Spring集成的 WebServer实例

    CXF是一个开源的Java服务框架,它允许开发人员通过简单的API创建和使用Web服务,而Spring则是一个全面的企业级应用开发框架,提供了包括依赖注入、面向切面编程等在内的多种功能。本文将深入探讨如何将CXF与Spring...

    实现隐式和显式 SOAP 消息头

    1. **WSDL工具**:如Apache CXF的wsdl2java工具,可以自动生成Java客户端和服务端代码,包括处理SOAP头的类。 2. **SOAPUI**:强大的SOAP测试工具,允许创建、编辑和调试SOAP消息,包括头部信息。 ### 六、源码实践...

    关于使用xfire创建webservice,并且使用消息头的示例

    2. **使用JAXB**(Java Architecture for XML Binding)来将你的消息头类映射到XML格式,这样XFire就可以处理它。 3. **配置消息处理器**:在XFire的配置中,定义一个消息处理器(MessageHandler),它会在消息被...

    作业报告2

    4. **Handler的实现**:Handler需要获取SoapHeader中的认证信息并调用验证服务,同时处理异常情况,比如保存错误消息。在修改分数后,Handler会根据返回的SOAP消息更新学生的相关信息。 5. **Resolver**:Resolver...

    soapHeader验证例子

    为了处理SOAP头,可以创建一个实现了`Handler&lt;SOAPMessageContext&gt;`接口的类,重写其`handleMessage`方法来检查或修改SOAP头。 4. **客户端实现**: ClientDemo_WebServiceSoapHeader包含了一个客户端示例,用于...

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

    在xfire中,你可以通过自定义处理程序来处理SOAP头信息。创建一个实现了`org.xfire.soap.handler.HeaderHandler`接口的类,然后在xfire的配置中注册这个处理程序。这样,你可以在接收到请求时检查SOAP Header中的...

    多线程socket+webservice操作demo

    - 配置XML文件以定义服务接口、实现、端点等信息。 - 创建`XFireContainer`实例加载配置。 2. **发布服务** - 使用`XFireContainer`发布服务到特定URL。 3. **消费服务** - 创建服务代理类,并通过代理调用...

    webservice客户端

    CXF提供了丰富的API和工具,使得开发者可以轻松地构建和使用Web服务。不依赖Spring的情况下,我们将手动完成CXF客户端的配置,包括服务接口定义、服务地址绑定、客户端代理对象创建等步骤。 首先,我们需要定义服务...

    webservices

    - CXF提供了多种运行时支持,如Spring集成、拦截器(Interceptors)、拦截链(Handler Chains)等,用于处理事务、安全、日志等复杂需求。 - 拦截器允许在服务调用前后执行自定义逻辑,增强服务的功能和灵活性。 ...

    Axis1.4_开发指南

    WSDD文件中的高级特性包括使用Handler(处理程序)来修改消息的处理流程,以及Chain(链)特性,它允许在处理消息时串联多个Handler进行一系列的操作。 ### 处理复杂对象的传递 Axis允许在WebService中传递复杂...

    jaxrs-js-client:拦截器中的简单 CXF,允许为 JAXRS 应用程序生成 jquery 或 angularjs 客户端。 笔记

    添加com.github.rmannibuau.jaxrs.js.handler.JsInterceptor作为 CXF(总线或服务器)中的拦截器。 JQuery 示例 对于以下应用: @ApplicationPath ( " api " ) public class App extends Application {} @Path ( ...

Global site tag (gtag.js) - Google Analytics