WebService CXF 中的拦截器(Interceptor)

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

 

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

 

1、客户端的拦截器

     在UserServiceClient.java添加拦截器

    

Java代码   收藏代码
  1. package com.wy.object.client;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Random;  
  6.   
  7. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  8. import org.apache.cxf.interceptor.LoggingOutInterceptor;  
  9. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
  10.   
  11. import com.wy.object.Users;  
  12. import com.wy.object.entry.User;  
  13. import com.wy.object.server.IUserService;  
  14.   
  15. /** 
  16.  * 调用UserService客户端 
  17.  *  
  18.  * @author Administrator 
  19.  *  
  20.  */  
  21. public class UserServiceClient {  
  22.     public static void main(String[] args) {  
  23.   
  24.         // 调用WebService  
  25.         JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();  
  26.         factory.setServiceClass(IUserService.class);  
  27.         factory.setAddress("http://localhost:8080/WebServiceCXF/services/IUserService");  
  28.         // 拦截器  
  29.         factory.getInInterceptors().add(new LoggingInInterceptor());  
  30.         factory.getOutInterceptors().add(new LoggingOutInterceptor());  
  31.           
  32.         IUserService service = (IUserService) factory.create();  
  33.           
  34.         //string  
  35.         System.out.println("@@@@@@@@@@@@@Client getUserByName@@@@@@@@@@@@@@");  
  36.         User user = service.getUserByName("Jack");  
  37.         System.out.println("Client: "+ user);  
  38.         user.setAddress("China-BeiJing");  
  39.           
  40.         //object JavaBean  
  41.         service.setUser(user);  
  42.   
  43.         //传递集合的包装对象 List  
  44.         System.out.println("#############Client getUsers###################");  
  45.         Users users = service.getUsers(4);  
  46.         System.out.println("Client: "+ users);  
  47.         List<User> tempUsers = new ArrayList<User>();  
  48.         for (User u : users.getUsers()) {  
  49.             System.out.println("Client: "+ u);  
  50.             u.setName("Jack" + new Random().nextInt(100));  
  51.             u.setAddress("Chian-BeiJing # " + new Random().nextInt(100));  
  52.             tempUsers.add(u);  
  53.         }  
  54.         users.getUsers().clear();  
  55.         users.getUsers().addAll(tempUsers);  
  56.           
  57.         service.setUsers(users);  
  58.   
  59.         //传递集合的包装对象 Array  
  60.         System.out.println("$$$$$$$$$$$$Client getUserArray$$$$$$$$$$$$$$$");  
  61.         users = service.getUserArray(4);  
  62.         User[] userArr = new User[4];  
  63.         int i = 0;  
  64.         for (User u : users.getUserArr()) {  
  65.             System.out.println("Client: "+ u);  
  66.             u.setName("Jack" + new Random().nextInt(100));  
  67.             u.setAddress("Chian-ShenZhen # " + new Random().nextInt(100));  
  68.             userArr[i] = u;  
  69.             i++;  
  70.         }  
  71.         users.setUserArr(userArr);  
  72.           
  73.         service.setUserArray(users);  
  74.   
  75.         //传递集合的包装对象 Map  
  76.         System.out.println("------------Client getUserMap----------------");  
  77.         users = service.getUserMap();  
  78.         System.out.println("Client: "+ users.getMaps());  
  79.         users.getMaps().put("ABA", userArr[0]);  
  80.         service.setUserMap(users);  
  81.   
  82.     }  
  83. }  

 

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

 

 

Java代码   收藏代码
  1. package com.wy.object.interceptor;  
  2.   
  3. import org.apache.cxf.interceptor.Fault;  
  4. import org.apache.cxf.message.Message;  
  5. import org.apache.cxf.phase.AbstractPhaseInterceptor;  
  6.   
  7. @SuppressWarnings("unchecked")  
  8. public class MessageInterceptor extends AbstractPhaseInterceptor {  
  9.   
  10.     public MessageInterceptor(String phase) {  
  11.         super(phase);  
  12.     }  
  13.   
  14.     @Override  
  15.     public void handleMessage(Message msg) throws Fault {  
  16.         System.out.println("############handleMessage##########");  
  17.   
  18.         System.out.println(msg);  
  19.   
  20.         if (msg.getDestination() != null) {  
  21.   
  22.             System.out.println(msg.getId() + "#"  
  23.                     + msg.getDestination().getMessageObserver());  
  24.   
  25.         }  
  26.   
  27.         if (msg.getExchange() != null) {  
  28.   
  29.             System.out.println(msg.getExchange().getInMessage() + "#"  
  30.                     + msg.getExchange().getInFaultMessage());  
  31.   
  32.             System.out.println(msg.getExchange().getOutMessage() + "#"  
  33.                     + msg.getExchange().getOutFaultMessage());  
  34.   
  35.         }  
  36.   
  37.     }  
  38.   
  39. }  

 

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

 

Java代码   收藏代码
  1. package com.wy.object;  
  2.   
  3. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;  
  4. import org.apache.cxf.phase.Phase;  
  5.   
  6. import com.wy.object.interceptor.MessageInterceptor;  
  7. import com.wy.object.server.IUserService;  
  8. import com.wy.object.server.impl.UserService;  
  9.   
  10. public class DeployInterceptorUserService {  
  11.     @SuppressWarnings("unchecked")  
  12.     public static void main(String[] args) throws InterruptedException {  
  13.   
  14.         // 发布WebService  
  15.         JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();  
  16.         // 设置Service Class  
  17.         factory.setServiceClass(IUserService.class);  
  18.         factory.setAddress("http://localhost:8080/WebServiceCXF/services/IUserService");  
  19.   
  20.         // 设置ServiceBean对象  
  21.         factory.setServiceBean(new UserService());  
  22.   
  23.         // 添加请求和响应的拦截器,Phase.RECEIVE只对In有效,Phase.SEND只对Out有效  
  24.         factory.getInInterceptors().add(new MessageInterceptor(Phase.RECEIVE));  
  25.         factory.getOutInterceptors().add(new MessageInterceptor(Phase.SEND));  
  26.   
  27.         factory.create();  
  28.   
  29.         System.out.println("Server start ......");  
  30.         Thread.sleep(1000 * 60);  
  31.         System.out.println("Server exit ");  
  32.         System.exit(0);  
  33.   
  34.     }  
  35. }  

 

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值