WebService CXF 中的拦截器(Interceptor)

本文介绍如何在CXF中使用Interceptor,通过客户端和服务端的实际案例展示了Interceptor的配置及自定义过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值