使用CXF为Web Service添加拦截器,自定义拦截器
使用CXF为Web Service添加拦截器,自定义拦截器
车开源 发表于2年前
使用CXF为Web Service添加拦截器,自定义拦截器
  • 发表于 2年前
  • 阅读 65
  • 收藏 3
  • 点赞 1
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 为第三方系统提供用户信息的WebService接口,然后逼着自己搞起了CXF+Spring
拦截器分为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);
        }    
    }
}



共有 人打赏支持
粉丝 12
博文 33
码字总数 8419
×
车开源
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: