微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  7. import org.apache.cxf.interceptor.LoggingOutInterceptor;  
  8. import org.apache.cxf.jaxws.JaxWsProxyfactorybean;  
  9. import com.wy.object.Users;  
  10. import com.wy.object.entry.User;  
  11. import com.wy.object.server.IUserService;  
  12. /** 
  13.  * 调用UserService客户端 
  14.  *  
  15.  * @author Administrator 
  16.  */  
  17. public class UserServiceClient {  
  18.     static void main(String[] args) {  
  19.         // 调用WebService  
  20.         JaxWsProxyfactorybean factory = new JaxWsProxyfactorybean();  
  21.         factory.setServiceClass(IUserService.class);  
  22.         factory.setAddress("http://localhost:8080/WebServiceCXF/services/IUserService");  
  23. // 拦截器  
  24.         factory.getininterceptors().add(new LoggingInInterceptor());  
  25.         factory.getoutInterceptors().add(new LoggingOutInterceptor());  
  26.           
  27.         IUserService service = (IUserService) factory.create();  
  28. //string  
  29.         System.out.println("@@@@@@@@@@@@@Client getUserByName@@@@@@@@@@@@@@");  
  30.         User user = service.getUserByName("Jack");  
  31.         System.out.println("Client: "+ user);  
  32.         user.setAddress("China-BeiJing");  
  33. //object JavaBean  
  34.         service.setUser(user);  
  35. //传递集合的包装对象 List  
  36.         System.out.println("#############Client getUsers###################");  
  37.         Users users = service.getUsers(4);  
  38.         System.out.println("Client: "+ users);  
  39.         List<User> tempusers = new ArrayList<User>();  
  40.         for (User u : users.getUsers()) {  
  41.             System.out.println("Client: "+ u);  
  42.             u.setName("Jack" + new Random().nextInt(100));  
  43.             u.setAddress("Chian-BeiJing # " +              tempusers.add(u);  
  44.         }  
  45.         users.getUsers().clear();  
  46.         users.getUsers().addAll(tempusers);  
  47.         service.setUsers(users);  
  48. //传递集合的包装对象 Array  
  49.         System.out.println("$$$$$$$$$$$$Client getUserArray$$$$$$$$$$$$$$$");  
  50.         users = service.getUserArray(         User[] userArr = new User[4];  
  51. int i = 0;  
  52. for (User u : users.getUserArr()) {  
  53.             u.setAddress("Chian-ShenZhen # " +              userArr[i] = u;  
  54.             i++;  
  55.         users.setUserArr(userArr);  
  56.         service.setUserArray(users);  
  57. //传递集合的包装对象 Map  
  58.         System.out.println("------------Client getUserMap----------------");  
  59.         users = service.getUserMap();  
  60.         System.out.println("Client: "+ users.getMaps());  
  61.         users.getMaps().put("ABA", userArr[0]);  
  62.         service.setUserMap(users);  
  63.     }  
  64. }  

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")  
  • class MessageInterceptor extends AbstractPhaseInterceptor {  
  • public MessageInterceptor(String phase) {  
  • super(phase);  
  •     @Override  
  • 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() !=              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.impl.UserService;  
  • class DeployInterceptorUserService {  
  • void main(String[] args) throws InterruptedException {  
  • // 发布WebService  
  •         JaxWsServerfactorybean factory = new JaxWsServerfactorybean();  
  • // 设置Service Class  
  • // 设置ServiceBean对象  
  •         factory.setServiceBean(new UserService());  
  • // 添加请求和响应的拦截器,Phase.RECEIVE只对In有效,Phase.SEND只对Out有效  
  • new MessageInterceptor(Phase.RECEIVE));  
  • 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

  • 版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

    相关推荐