`

WebService CXF 中的拦截器(Interceptor)

阅读更多

CXF的Interceptor在每个请求响应之前或响应之后,做一些事情。这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。下面我们就看看CXF的Interceptor是怎么样工作的。

 

我们还是使用上一篇文章的工程,做一些添加与修改!

 

1、客户端的拦截器

     在UserServiceClient.java添加拦截器

    

package com.wy.object.client;

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

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

import com.wy.object.Users;
import com.wy.object.entry.User;
import com.wy.object.server.IUserService;

/**
 * 调用UserService客户端
 * 
 * @author Administrator
 * 
 */
public class UserServiceClient {
	public static void main(String[] args) {

		// 调用WebService
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		factory.setServiceClass(IUserService.class);
		factory.setAddress("http://localhost:8080/WebServiceCXF/services/IUserService");
		// 拦截器
        factory.getInInterceptors().add(new LoggingInInterceptor());
        factory.getOutInterceptors().add(new LoggingOutInterceptor());
        
		IUserService service = (IUserService) factory.create();
		
		//string
		System.out.println("@@@@@@@@@@@@@Client getUserByName@@@@@@@@@@@@@@");
		User user = service.getUserByName("Jack");
		System.out.println("Client: "+ user);
		user.setAddress("China-BeiJing");
		
		//object JavaBean
		service.setUser(user);

		//传递集合的包装对象 List
		System.out.println("#############Client getUsers###################");
		Users users = service.getUsers(4);
		System.out.println("Client: "+ users);
		List<User> tempUsers = new ArrayList<User>();
		for (User u : users.getUsers()) {
			System.out.println("Client: "+ u);
			u.setName("Jack" + new Random().nextInt(100));
			u.setAddress("Chian-BeiJing # " + new Random().nextInt(100));
			tempUsers.add(u);
		}
		users.getUsers().clear();
		users.getUsers().addAll(tempUsers);
		
		service.setUsers(users);

		//传递集合的包装对象 Array
		System.out.println("$$$$$$$$$$$$Client getUserArray$$$$$$$$$$$$$$$");
		users = service.getUserArray(4);
		User[] userArr = new User[4];
		int i = 0;
		for (User u : users.getUserArr()) {
			System.out.println("Client: "+ u);
			u.setName("Jack" + new Random().nextInt(100));
			u.setAddress("Chian-ShenZhen # " + new Random().nextInt(100));
			userArr[i] = u;
			i++;
		}
		users.setUserArr(userArr);
		
		service.setUserArray(users);

		//传递集合的包装对象 Map
		System.out.println("------------Client getUserMap----------------");
		users = service.getUserMap();
		System.out.println("Client: "+ users.getMaps());
		users.getMaps().put("ABA", userArr[0]);
		service.setUserMap(users);

	}
}

 

2、 刚才是客户端添加Interceptor,现在我们自己编写一个Interceptor,这个Interceptor需要继承 AbstractPhaseInterceptor,实现handleMessage和一个带参数的构造函数。然后在服务器端添加这个 Interceptor。

 

 

package com.wy.object.interceptor;

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;

@SuppressWarnings("unchecked")
public class MessageInterceptor extends AbstractPhaseInterceptor {

	public MessageInterceptor(String phase) {
		super(phase);
	}

	@Override
	public void handleMessage(Message msg) throws Fault {
		System.out.println("############handleMessage##########");

		System.out.println(msg);

		if (msg.getDestination() != null) {

			System.out.println(msg.getId() + "#"
					+ msg.getDestination().getMessageObserver());

		}

		if (msg.getExchange() != null) {

			System.out.println(msg.getExchange().getInMessage() + "#"
					+ msg.getExchange().getInFaultMessage());

			System.out.println(msg.getExchange().getOutMessage() + "#"
					+ msg.getExchange().getOutFaultMessage());

		}

	}

}

 

发布服务和添加自定义拦截器的代码:

 

package com.wy.object;

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.phase.Phase;

import com.wy.object.interceptor.MessageInterceptor;
import com.wy.object.server.IUserService;
import com.wy.object.server.impl.UserService;

public class DeployInterceptorUserService {
	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws InterruptedException {

		// 发布WebService
		JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
		// 设置Service Class
		factory.setServiceClass(IUserService.class);
		factory.setAddress("http://localhost:8080/WebServiceCXF/services/IUserService");

		// 设置ServiceBean对象
		factory.setServiceBean(new UserService());

		// 添加请求和响应的拦截器,Phase.RECEIVE只对In有效,Phase.SEND只对Out有效
		factory.getInInterceptors().add(new MessageInterceptor(Phase.RECEIVE));
		factory.getOutInterceptors().add(new MessageInterceptor(Phase.SEND));

		factory.create();

		System.out.println("Server start ......");
		Thread.sleep(1000 * 60);
		System.out.println("Server exit ");
		System.exit(0);

	}
}

 

DeployInterceptorUserService.java与DeployUserService.java在发布服务的略有不同:

以前发布WebService是用Endpoint的push方法。

这里用的是JaxWsServerFactoryBean和客户端调用的代码JaxWsProxyFactoryBean。

 

 

 

 

 

分享到:
评论

相关推荐

    CXF WebService带有拦截器

    总结起来,"CXF WebService带有拦截器"的实践是Web服务开发中的一个重要方面,它允许我们在不侵入核心业务逻辑的情况下,增加诸如权限控制这样的安全特性。通过"AuthFilter_Service"和"AuthFilter_Client",我们可以...

    webservice的cxf框架拦截器demo

    本篇将深入探讨CXF框架中的拦截器(Interceptor)及其在"webservice的cxf框架拦截器demo"中的应用。 拦截器在CXF中是一种强大的工具,它允许开发者在消息发送或接收的过程中插入自定义的行为。这在处理认证、日志...

    CXF拦截器(Interceptor)的使用

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

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

    在Java世界中,Apache CXF是一个广泛使用的开源框架,它允许开发者创建和消费Web服务。在Web服务开发中,拦截器扮演着至关重要的角色,...总的来说,理解并熟练运用CXF拦截器对于任何CXF开发者来说都是一项重要的技能。

    WebService之自定义拦截器(server+client)

    1. **创建拦截器类**:继承自CXF提供的相应拦截器基类,如`org.apache.cxf.interceptor.FaultInterceptor`或`org.apache.cxf.interceptor.ClientInterceptor`。 2. **覆盖关键方法**:如`handleMessage(Message)`或`...

    webservice的cxf框架拦截器demo.rar

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

    CXF发布WebService加入拦截器

    CXF拦截器是一种AOP(面向切面编程)的概念,它们是执行特定任务的独立单元,可以在消息传递的生命周期中不同阶段被调用。拦截器可以用来处理如认证、授权、日志记录、性能监控、数据转换等任务,增强了服务的功能和...

    13.为CXF与Spring整合发布WebService添加拦截器进行权限控制

    在Spring框架中,我们可以使用Spring的`@Bean`注解来配置CXF拦截器。首先,我们需要创建一个实现了`org.apache.cxf.interceptor.Fault`和`org.apache.cxf.phase.PhaseInterceptor`接口的类。这个类通常会包含处理...

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

    本文将深入探讨"CXF拦截器-权限控制-登录校验"这一主题。 首先,我们需要了解什么是拦截器。在CXF框架中,拦截器是实现业务逻辑和基础架构之间解耦的一种方式。它们可以插入到服务调用的生命周期中,在消息发送前或...

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

    在CXF中,自定义拦截器可以通过实现`org.apache.cxf.interceptor.Fault`和`org.apache.cxf.phase.Phase`接口来创建。 6. **安全性考虑**:通过客户端添加header并由服务端验证的方式,可以实现基于header的安全机制...

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

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

    08.CXF拦截器的理论以及如何为CXF的客户端和服务器端添加拦截器

    **CXF拦截器理论与应用** 在Web服务领域,Apache CXF是一个强大的开源框架,它提供了构建和消费SOAP和RESTful服务的能力。拦截器是CXF框架中的一个重要组成部分,允许开发者在服务调用的生命周期中插入自定义逻辑,...

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

    在CXF中,拦截器可以插入到消息处理管道中,对请求和响应进行处理。 要为CXF客户端添加自定义拦截器,我们需要遵循以下步骤: 1. **创建拦截器类**:首先,创建一个实现了`org.apache.cxf.interceptor....

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

    在开发基于CXF的Web服务时,为了确保系统的安全性和数据的完整性,通常需要对请求进行权限检查。本文将深入探讨如何为CXF服务器...在学习和应用这些知识时,结合实际案例和实践操作将有助于更好地掌握CXF拦截器的使用。

    WebService_CXF实现及ANT

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

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

    1. **CXF Interceptors机制**:CXF采用了一种基于拦截器的架构,允许开发者在消息处理的不同阶段插入自定义的行为。这些拦截器可以被用来执行各种任务,比如安全检查、日志记录等。 2. **Logging Message**:CXF内部...

    CXF-WebService-开发指南、技术文档.docx

    通过实现`org.apache.cxf.interceptor.Fault`和`org.apache.cxf.phase.Phase`接口,可以创建自定义拦截器,并在服务上下文中注册。 **四、CXF WebService 中传递复杂类型对象** CXF允许在Web服务中传递复杂类型的...

    CXF WebService 开发指南、技术文档

    #### 三、CXF 对 Interceptor 拦截器的支持 CXF支持使用Interceptor来扩展服务行为,类似于Servlet中的Filter。Interceptor可以用来处理请求和响应消息的预处理和后处理操作。 1. **定义Interceptor**: - 继承`...

    CXF实现WebService.doc

    8. **拦截器和扩展性**:CXF通过拦截器(Interceptor)机制,允许开发者自定义行为,增强服务功能。拦截器可以在消息发送前或接收后执行特定操作,增强了框架的扩展性。 9. **测试与调试**:CXF提供了一些内置工具...

    WebService发布框架CXF的源码

    - `org.apache.cxf.interceptor.Interceptor`:处理消息的拦截器,提供了对请求和响应进行预处理和后处理的机制。 - `org.apache.cxf.frontend.ServerFactoryBean`和`ClientFactoryBean`:分别用于配置和创建服务器...

Global site tag (gtag.js) - Google Analytics