• 使用CXF为webservice添加拦截器


     

    拦截器分为Service端Client端

         拦截器是在发送soap消息包的某一个时机拦截soap消息包,对soap消息包的数据进行分析或处理。分为CXF自带的拦截器自定义的拦截器

    1、Service端:

    通过将org.apache.cxf.jaxws.EndpointImpl类的方法即可实现

      发布Web Service 方法可以通过Endpoint.publish()方法,此方法返为EndpointImpl,所以为Service端添加拦截器很简单。

    部分代码:
    UserService us = new UserServiceImpl();
    String address = "http://192.168.10.254:9999/crazyit";
    EndpointImpl ep = (EndpointImpl)Endpoint.publish(address , us);
    //下面方法就可以添加拦截器(CXF提供的拦截器)
    //cxf-2.2.10.jar  org.apache.cxf.interceptor.* (CXF提供的拦截器)
    ep.getOutInterceptors().add(new LoggingOutInterceptor());
    ep.getInInterceptors().add(new LoggingInInterceptor());
    ep.getInInterceptors().add(new AuthIntercetpr()); //此拦截器是自定义的拦截器。

    2、Client端 客户端可以通过对org.apache.cxf.frontend.ClientProxy中的getClient()方法获取org.apache.cxf.endpoint.Client对象,该对象可以为客户端添拦截器。

    部分代码
    //为客户端添加拦截器
    org.apache.cxf.endpoint.Client client = ClientProxy.getClient(us);
    client.getInInterceptors().add(new LoggingInInterceptor());
    client.getOutInterceptors().add(new LoggingOutInterceptor());
    //自定义拦截器
    client.getOutInterceptors().add(new AddHeaderInterceptor("crazyit" , "crazyit.org2"));

    3、自定义的拦截器

       自定义拦截器需要继承org.apache.cxf.phase.AbstractPhaseInterceptor 抽象类,并实现其handleMessage方法,与重写自定义的构造器(由于AbstractPhaseInterceptor 没有无参构造器,所以要在自定义构拦截器的造器中调用supper(带参数))。

    部分代码
    public class AuthIntercetpr     extends AbstractPhaseInterceptor<SoapMessage> {
        public AuthIntercetpr()     {        
     //子类总会调用父类的构造器,         
    //默认是调用无参数的构造器。
            //指定该拦截器在哪个阶段被激发       
      super(Phase.PRE_INVOKE);   
      }
        //处理消息   
      public void handleMessage(SoapMessage message)     {   
          System.out.println("==================" + message);
            //获取SOAP消息的全部头    
         List<Header> headers = message.getHeaders();
            if(headers.size() < 1)         {   
              throw new Fault(new SOAPException("SOAP消息头格式不对哦!"));     
        }        
            for(Header header : headers)         {  
               SoapHeader soapHeader = (SoapHeader)header;          
       //取出SOAP的Header元素        
         Element element = (Element)soapHeader.getObject();      
           checkSOAPHeader(element);       
      }        
     }
  • 相关阅读:
    CodingSouls团队项目冲刺(4)-个人概况
    第八周周总结
    CodingSouls团队项目冲刺(3)-个人概况
    CodingSouls团队项目冲刺(2)-个人概况
    线程中的join使用
    向线程传递数据的三种方法
    Java collections使用介绍
    Guava Collections使用介绍[超级强大]
    重构改善既有代码的设计--重新组织数据
    重构改善既有代码的设计--在对象之间搬移特性
  • 原文地址:https://www.cnblogs.com/lonelywolfmoutain/p/4195756.html
Copyright © 2020-2023  润新知