加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService CXF 中的拦截器(Interceptor)

发布时间:2020-12-16 23:24:16 所属栏目:安全 来源:网络整理
导读:CXF的Interceptor在每个请求响应之前或响应之后,做一些事情。这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。下面我们就看看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。

  • (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读