使用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); }
相关推荐
在开发基于SOAP协议的服务时,有时我们需要在请求中添加特定的Header信息,这在CXF框架下可以通过编程方式实现。Apache CXF是一个流行的开源服务框架,支持SOAP和RESTful服务的开发、部署和消费。本示例将详细介绍...
1. **CXF拦截器基础**:CXF的拦截器是基于JAX-WS规范的Handler Chain模型,分为In-bound(请求进来时触发)和Out-bound(响应出去时触发)两类。拦截器可以通过在服务配置中指定,或者通过编程方式动态添加。 2. **...
1. **CXF基础**:介绍CXF的基本概念,如服务端点(Endpoint)、客户端代理(Client Proxy)、数据绑定(Data Binding)和消息处理模型。 2. **SOAP与RESTful**:讲解如何使用CXF创建和消费SOAP Web服务,以及如何...
"cxf超时设置"这个主题是关于如何在使用CXF框架时,对网络通信的超时时间进行配置,以优化服务的稳定性和性能。 首先,理解超时的概念至关重要。在计算机网络中,超时是指等待某个操作完成的时间限制。当这个时间...
本文将深入探讨如何使用Ksoap2在Android客户端实现与使用Apache CXF和WSS4J安全框架的Web服务的认证过程。 **Ksoap2库** Ksoap2是一个轻量级的开源库,专门用于Android平台,它允许Android应用通过HTTP/HTTPS协议...
本文将详细探讨如何使用CXF 2.6版本与Spring框架结合,来提供REST服务并输出XML或JSON格式的数据。 首先,我们需要理解CXF的核心概念。CXF全称是Camel eXtended for Web Services,它提供了全面的Web服务实现,包括...
本示例着重于CXF客户端如何处理对象参数传递以及支持文件的上传和下载,特别是实现了断点续传功能,这在大文件传输时尤为关键。 【对象传参】: CXF允许通过JAXB(Java Architecture for XML Binding)将Java对象...
拦截器是基于JAX-WS规范的Handler链,开发者可以通过编写自定义的Handler类并将其注册到CXF中,实现对服务请求和响应的透明处理。 最后,"lib"目录下的jar包包含了所有必要的依赖,这些库文件涵盖了CXF、Spring以及...
CXF是一个开源的Java服务框架,它允许开发人员通过简单的API创建和使用Web服务,而Spring则是一个全面的企业级应用开发框架,提供了包括依赖注入、面向切面编程等在内的多种功能。本文将深入探讨如何将CXF与Spring...
1. **WSDL工具**:如Apache CXF的wsdl2java工具,可以自动生成Java客户端和服务端代码,包括处理SOAP头的类。 2. **SOAPUI**:强大的SOAP测试工具,允许创建、编辑和调试SOAP消息,包括头部信息。 ### 六、源码实践...
2. **使用JAXB**(Java Architecture for XML Binding)来将你的消息头类映射到XML格式,这样XFire就可以处理它。 3. **配置消息处理器**:在XFire的配置中,定义一个消息处理器(MessageHandler),它会在消息被...
4. **Handler的实现**:Handler需要获取SoapHeader中的认证信息并调用验证服务,同时处理异常情况,比如保存错误消息。在修改分数后,Handler会根据返回的SOAP消息更新学生的相关信息。 5. **Resolver**:Resolver...
为了处理SOAP头,可以创建一个实现了`Handler<SOAPMessageContext>`接口的类,重写其`handleMessage`方法来检查或修改SOAP头。 4. **客户端实现**: ClientDemo_WebServiceSoapHeader包含了一个客户端示例,用于...
在xfire中,你可以通过自定义处理程序来处理SOAP头信息。创建一个实现了`org.xfire.soap.handler.HeaderHandler`接口的类,然后在xfire的配置中注册这个处理程序。这样,你可以在接收到请求时检查SOAP Header中的...
- 配置XML文件以定义服务接口、实现、端点等信息。 - 创建`XFireContainer`实例加载配置。 2. **发布服务** - 使用`XFireContainer`发布服务到特定URL。 3. **消费服务** - 创建服务代理类,并通过代理调用...
CXF提供了丰富的API和工具,使得开发者可以轻松地构建和使用Web服务。不依赖Spring的情况下,我们将手动完成CXF客户端的配置,包括服务接口定义、服务地址绑定、客户端代理对象创建等步骤。 首先,我们需要定义服务...
- CXF提供了多种运行时支持,如Spring集成、拦截器(Interceptors)、拦截链(Handler Chains)等,用于处理事务、安全、日志等复杂需求。 - 拦截器允许在服务调用前后执行自定义逻辑,增强服务的功能和灵活性。 ...
WSDD文件中的高级特性包括使用Handler(处理程序)来修改消息的处理流程,以及Chain(链)特性,它允许在处理消息时串联多个Handler进行一系列的操作。 ### 处理复杂对象的传递 Axis允许在WebService中传递复杂...
添加com.github.rmannibuau.jaxrs.js.handler.JsInterceptor作为 CXF(总线或服务器)中的拦截器。 JQuery 示例 对于以下应用: @ApplicationPath ( " api " ) public class App extends Application {} @Path ( ...