前面讲了如何采用CXF开发webservice,现在来讲如何添加拦截器和自定义拦截器。

  服务端代码:

     HelloWorld implementor=new HelloWorldImpl();
String address="http://192.xxx.15.117:8089/helloWorld";
// Endpoint.publish(address, implementor); // jdk实现 暴露webservice接口
JaxWsServerFactoryBean factoryBean=new JaxWsServerFactoryBean();
factoryBean.setAddress(address); // 设置暴露地址
factoryBean.setServiceClass(HelloWorld.class); // 接口类
factoryBean.setServiceBean(implementor); // 设置实现类
  factoryBean.getInInterceptors().add(new LoggingInInterceptor()); // 添加in拦截器 日志拦截器
  factoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); // 添加out拦截器 日志拦截器
factoryBean.getInInterceptors().add(new MyInterceptor()); //自定义拦截器
factoryBean.create(); // 创建webservice接口

  自定义拦截器类:

public class MyInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

    public MyInterceptor() {
super(Phase.PRE_INVOKE); // 在调用方法之前调用自定拦截器 } @SuppressWarnings("null")
public void handleMessage(SoapMessage message) throws Fault {
List<Header> headers=message.getHeaders();
if(headers==null && headers.size()==0){
throw new Fault(new IllegalArgumentException("没有Header,拦截器实施拦截"));
}
Header firstHeader=headers.get(0);
Element ele=(Element) firstHeader.getObject();
NodeList uList=ele.getElementsByTagName("userName");
NodeList pList=ele.getElementsByTagName("password");
if(uList.getLength()!=1){
throw new Fault(new IllegalArgumentException("用户名格式不对"));
}
if(pList.getLength()!=1){
throw new Fault(new IllegalArgumentException("密码格式不对"));
}
String userName=uList.item(0).getTextContent();
String password=pList.item(0).getTextContent(); if(!userName.equals("java1234")||!password.equals("123456")){
throw new Fault(new IllegalArgumentException("用户名或者密码错误!"));
}
} }

  客户端代码:

  先通过输入命令: wsdl2java http://192.xxx.15.117:8089/helloWorld?wsdl 生成需要的代码,谈话编写调用方法。

     HelloWorldImplService service=new HelloWorldImplService();
HelloWorld helloWorld=service.getHelloWorldImplPort();
org.apache.cxf.endpoint.Client client=ClientProxy.getClient(helloWorld); client.getOutInterceptors().add(new AddHeaderInterceptor("java1234","123")); // 添加自定义拦截器
client.getInInterceptors().add(new LoggingInInterceptor()); // 添加In拦截器 日志拦截器
client.getOutInterceptors().add(new LoggingOutInterceptor()); // 添加Out拦截器 日志拦截器

  自定义拦截器:

public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

    private String userName;
private String password; public AddHeaderInterceptor(String userName,String password) {
super(Phase.PREPARE_SEND); // 准备发送SOAP消息的时候调用拦截器
this.userName=userName;
this.password=password;
} public void handleMessage(SoapMessage message) throws Fault {
List<Header> headerList=message.getHeaders(); Document doc=DOMUtils.createDocument();
Element ele=doc.createElement("authHeader");
Element uElement=doc.createElement("userName");
uElement.setTextContent(userName);
Element pElement=doc.createElement("password");
pElement.setTextContent(password); ele.appendChild(uElement);
ele.appendChild(pElement); headerList.add(new Header(new QName("java1234"),ele)); } }

完成!

最新文章

  1. 利用border-radious画图形
  2. C++温习
  3. 130. Surrounded Regions -- 被某字符包围的区域
  4. 通过新浪ip地址库获得用户的省份、城市等信息
  5. OpenGL ES为缓存提供数据的7个步骤
  6. 是C太傻逼?还是C++不够傻逼;
  7. HTML5 汽泡效果
  8. Hibernate实现分页
  9. 在android里用ExpandableListView实现二层和三层列表
  10. 第1阶段——u-boot分析之make指令(2)
  11. json解析eval()中文乱码问题的解决
  12. IDEA 初始配置教程
  13. Go 语言Map(集合)
  14. inner join 与 left join 之间的区别
  15. 虚拟机console基础环境部署——配置本地YUM源
  16. React项目中使用hot-react-loader
  17. VMware相关服务启动关闭脚本
  18. jmeter 获取执行脚本的路径
  19. ios中在uiNavigationcontroller中做转场动画
  20. Service Fabric &mdash;&mdash; Actor / Stateless Service 概念

热门文章

  1. hadoop学习(四)----windows环境下安装hadoop
  2. 在MAC终端下打开Finder:
  3. 【POJ - 3280】Cheapest Palindrome(区间dp)
  4. [趣学程序]java的常用类之String
  5. Appium+python自动化(三十二)- 代码写死一时爽,框架重构火葬场 - PageObject+unittest(超详解)
  6. php cmd命令行 导入 与备份
  7. 数据库炸了——是谁动了我的wait_timeout
  8. Springboot源码分析之EnableAspectJAutoProxy
  9. 解读BloomFilter算法(转载)
  10. 怎样使用U盘安装Windows系统