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

(三)CXF使用Interceptor处理头信息

 
阅读更多

CXF提供了Interceptor拦截器链对SOAP消息进行拦截处理

拦截器分为不同的Phase,各个Phase又有自己的拦截器链,参考http://cxf.apache.org/docs/interceptors.html

 

 

 在客户端加入头信息

头信息为一个字符串

编写interceptor

PHASE:WRITE

package com.hqh.ws.cxf.interceptor;

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.databinding.DataBinding;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.jaxb.JAXBDataBinding;
import org.apache.cxf.phase.Phase;

public class LicenseOutInterceptor extends AbstractSoapInterceptor{
	/**
	 * 指定加入拦截器到某个阶段
	 * @param p
	 */
	public LicenseOutInterceptor() {
		super(Phase.WRITE);
	}

	@Override
	public void handleMessage(SoapMessage message) throws Fault {
		List<Header> headers = message.getHeaders();
		try {
			//创建QName
			String namespaceURI = "http://ws.cxf.hqh.com";
			String localPart = "license";
			String prefix = "ns";
			QName qname = new QName(namespaceURI, localPart, prefix);

			//创建需要使用header进行传输的对象
			String sendObj = "license for webservice";
			
			//创建DataBinding
			DataBinding dataBinding = new JAXBDataBinding(String.class);
			
			//创建Header
			Header header = new Header(qname, sendObj, dataBinding);
			//将header加入到SOAP头集合中
			headers.add(header);
		} catch (JAXBException e) {
			e.printStackTrace();
			throw new Fault(e);
		}
		
	}

}

 

调用服务时加入interceptor

/**
	 * 使用interceptor加入header
	 */
	@Test
	public void test03() {
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(IMyService.class);
		factory.setAddress("http://localhost:8888/cxf/ws?wsdl");
		//打印发出的消息
		factory.getOutInterceptors().add(new LoggingOutInterceptor());
		//加入自定义的拦截器
		factory.getOutInterceptors().add(new LicenseOutInterceptor());
		//获取服务对象
		IMyService service = (IMyService)factory.create();
		//调用服务
		String reply = service.sayHello("李思思");
		
		System.out.println(reply);
		System.exit(0);
	}

 

 

 

头信息为一个对象

 

package com.hqh.ws.cxf.model;

public class User {
	private String name;
	private String pwd;
	
	
	public User() {
		super();
	}
	public User(String name, String pwd) {
		super();
		this.name = name;
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
}

 

package com.hqh.ws.cxf.interceptor;

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.databinding.DataBinding;
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.hqh.ws.cxf.model.User;

public class LicenseOutInterceptor extends AbstractSoapInterceptor{
	/**
	 * 指定加入拦截器到某个阶段
	 * @param p
	 */
	public LicenseOutInterceptor() {
		super(Phase.WRITE);
	}

	@Override
	public void handleMessage(SoapMessage message) throws Fault {
		List<Header> headers = message.getHeaders();
		try {
			//创建QName
			String namespaceURI = "http://ws.cxf.hqh.com";
			String localPart = "license";
			String prefix = "ns";
			QName qname = new QName(namespaceURI, localPart, prefix);

			//创建需要使用header进行传输的对象
			//String sendObj = "license for webservice";
			
			//头信息为一个对象
			User user = new User("admin","admin1");
			
			//创建DataBinding
			//DataBinding dataBinding = new JAXBDataBinding(String.class);
			DataBinding dataBinding = new JAXBDataBinding(User.class);
			
			//创建Header
			//Header header = new Header(qname, sendObj, dataBinding);
			Header header = new Header(qname, user, dataBinding);
			
			//将header加入到SOAP头集合中
			headers.add(header);
		} catch (JAXBException e) {
			e.printStackTrace();
			throw new Fault(e);
		}
		
	}

}

 

客户端发出的SOAP消息

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
	<soap:Header>
		<ns:license xmlns:ns="http://ws.cxf.hqh.com">
			<name>admin</name>
			<pwd>admin1</pwd>
		</ns:license>
	</soap:Header>
	<soap:Body>
		<ns2:sayHello xmlns:ns2="http://cxf.ws.hqh.com/">
			<name>李思思</name>
		</ns2:sayHello>
	</soap:Body>
</soap:Envelope>

 

 

服务端使用拦截器获取头信息

PHASE:UNMARSHALLER

package com.hqh.ws.cxf.interceptor;

import java.util.List;

import javax.xml.bind.JAXBException;
import javax.xml.soap.SOAPException;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.databinding.DataBinding;
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 org.w3c.dom.Element;

import com.hqh.ws.cxf.model.User;

public class licenseInIntercptor extends AbstractSoapInterceptor{
	
	/**
	 * 指定拦截器使用的阶段
	 * 这里是服务端对header的拦截处理,指定到UNMARSHAL阶段
	 * 注意:不要指定到READ阶段,READ阶段获取到的是xml数据,还不能从message对象中获取到header的相关信息
	 * 在unmarshaller将xml转换为对象之后使用拦截器,才能从header对象中获取到数据
	 * @param p
	 */
	public licenseInIntercptor() {
		super(Phase.UNMARSHAL);
	}

	@Override
	public void handleMessage(SoapMessage message) throws Fault {
		//获取所有的header
		List<Header> headers = message.getHeaders();
		System.out.println("headers size:"+headers.size());
		try {
			//服务端能通过DataBinding进行对象的自动转换吗?在read/unmarshaller时加入?
			//DataBinding binding = new JAXBDataBinding(User.class);
			for(Header head : headers) {
				String localPart = head.getName().getLocalPart();
				System.out.println("当前头信息节点名称:"+localPart);
				if("license".equals(localPart)) {
					//获取cxf拦截器转换得到的头信息对象
					Object obj = head.getObject();
                                        //注意:这里获取到的obj并不是客户端指定的User对象!
					System.out.println(obj instanceof User);
					Element element = (Element)obj;
					String name = element.getElementsByTagName("name").item(0).getTextContent();
					String pwd = element.getElementsByTagName("pwd").item(0).getTextContent();
					if("admin".equals(name) && "admin".equals(pwd)) {
						System.out.println("验证成功");
					} else {
						SOAPException ex = new SOAPException("认证信息错误!");
						throw new Fault(ex);
					}
				}
			}
		} catch (Exception e) {
			//e.printStackTrace();
			throw new Fault(e);
		}
	}

}

 服务端发布服务时加入指定的拦截器

 

	/**
	 * 使用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.getInInterceptors().add(new licenseInIntercptor());
		
		svrFactory.create();
	}

 

 

 

 

 

 

 

 

  • 大小: 44.3 KB
分享到:
评论

相关推荐

    使用CXF Interceptor&Feature

    在IT行业中,Apache CXF是一个广泛使用的开源框架,它提供了创建和消费Web服务的能力。CXF使得开发人员能够轻松地实现服务接口,并将其部署为SOAP或RESTful服务。本篇文章将深入探讨如何利用CXF的Interceptor(拦截...

    CXF拦截器(Interceptor)的使用

    标题:“CXF拦截器(Interceptor)的使用” 描述:“讲解了cxf实现拦截器的原因、核心API及使用方法” 在深入探讨CXF拦截器的使用之前,我们首先需要理解其在CXF框架中的核心作用与价值。Apache CXF是一个开源框架,...

    CXF使用EndpointImpl发布WebService加入拦截器

    在Java世界中,Apache CXF是一个广泛使用的开源框架,它允许开发者创建和消费Web服务。在Web服务开发中,拦截器扮演着至关重要的角色,它们提供了在消息发送和接收过程中插入自定义逻辑的能力。本篇文章将深入探讨...

    CXF 添加soap 头部信息.zip_CXF增加soap头验证_bluex8z_cxf_meltedkw7_soap信息头

    安装完成后,可以使用SOAP UI等工具发送带有自定义SOAP头的请求,以测试CXF服务是否能够正确处理和验证头部信息。 综上所述,通过Apache CXF提供的Interceptor机制,我们可以方便地在SOAP消息中添加、读取和验证...

    使用CXF实现带header的soap服务

    4. **处理HTTP头信息**:CXF提供了拦截器(Interceptor)机制,可以通过自定义拦截器来读取和操作HTTP头。在`frontend/client`或`frontend/server`的拦截器链中添加自定义拦截器,拦截器可以访问并处理Message对象中...

    CXF发布WebService加入拦截器

    在Java世界中,Apache CXF是一个广泛使用的开源框架,它允许开发者创建和消费Web服务。当我们谈论"CXF发布WebService加入拦截器"时,这涉及到在CXF服务端和客户端增加拦截器来增强服务功能和控制流程。拦截器是CXF...

    CXF WebService带有拦截器

    你可以继承`org.apache.cxf.interceptor.FaultInterceptor`或`org.apache.cxf.interceptor.AbstractFaultInterceptor`类,并重写其`handleMessage`方法来插入自己的逻辑。然后,你需要在服务端或客户端的配置中注册...

    WebService_CXF实现及ANT

    在这个主题中,我们将深入探讨CXF的Interceptor拦截器、处理复杂类型对象的传递以及如何结合Spring进行集成,最后我们将学习如何使用ANT工具快速构建和部署CXF工程。 1. CXF Interceptor拦截器: 拦截器是CXF框架...

    CXF-拦截器-权限控制-登录校验

    CXF提供了丰富的功能,包括服务端和客户端的拦截器(Interceptor)机制,使得开发者能对服务调用进行自定义处理,如权限控制和登录校验。本文将深入探讨"CXF拦截器-权限控制-登录校验"这一主题。 首先,我们需要...

    cxf和对Interceptor的支持和传递复杂对象的小例子

    这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。以HelloWorldService为例子。 参照网址:...

    CXF打印SOAP报文,记录WebService日志

    通过上述步骤,我们成功实现了使用CXF打印SOAP报文的功能,并能够有效地记录WebService的日志信息。这对于调试和维护基于CXF的服务来说是非常有用的。此外,通过扩展此类自定义拦截器,还可以添加更多的功能,如安全...

    webservice的cxf框架拦截器demo

    例如,可以使用客户端拦截器添加额外的HTTP头信息,或者在请求失败时执行重试逻辑。在CXF中,我们可以创建实现`org.apache.cxf.interceptor.ClientInterceptor`接口的类,并通过`ClientProxy.getClient()`方法获取...

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

    3. **Spring集成**:在Spring3.2中,我们可以使用`&lt;cxf:bus&gt;`和`&lt;cxf:interceptor&gt;`标签将自定义拦截器注册到CXF Bus中。这样,Spring容器会管理拦截器的生命周期,并在需要时注入其他依赖。 4. **拦截器链**:CXF...

    10.为CXF服务器端添加自定义拦截器进行权限检查

    如果权限检查失败,拦截器应该抛出一个适当的异常,例如`org.apache.cxf.interceptor.Fault`,并附带错误信息。这样,CXF会捕获这个异常,并根据配置的策略返回相应的错误响应给客户端。 5. **测试与调试**: ...

    2.CXF安全访问之Http Basic Auth(一)

    同时,`org.apache.cxf.interceptor.security.BasicAuthInterceptor`拦截器处理了实际的身份验证过程,它会检查收到的请求是否包含正确的认证信息。 工具方面,CXF提供了多种工具帮助开发者管理和调试服务,如CXF的...

    11.为CXF客户端添加自定义拦截器完成权限控制

    4. **处理异常**:当拦截器检测到无权限访问时,应该抛出合适的异常,如`org.apache.cxf.interceptor.Fault`。客户端可以捕获这些异常,提供相应的错误信息反馈给用户。 5. **测试与调试**:添加完拦截器后,进行...

    SSH2-interceptor拦截器(权限管理)

    ssh2-interceptor拦截器(权限管理).

    Maven版,Spring mvc, CXF WebService, WebService/Controller Interceptor, Sitemesh

    在WebServices/Controller Interceptor中,拦截器可以用于在处理请求前验证参数,或者在响应返回前添加额外的头部信息。这增加了代码的灵活性和可扩展性。 Sitemesh是一个网页布局框架,主要用于解决Web应用中的...

    webservice的cxf框架拦截器demo.rar

    在CXF服务端,你可以通过实现`org.apache.cxf.interceptor.Fault`和`org.apache.cxf.phase.PhaseInterceptorChain`接口的类来创建自定义拦截器,并将它们添加到服务的拦截器链中。 4. **“inter_client”**: 这...

Global site tag (gtag.js) - Google Analytics