8.Web Service CXF添加自定义拦截器

本文介绍如何使用CXF框架自定义拦截器实现客户端和服务端的权限认证过程。客户端通过自定义拦截器在SOAP消息头部添加认证信息,服务端则通过自定义拦截器验证这些信息。

前面我们写到CXF添加内置的拦截器,今天的话,我们来写下如何添加自定义拦截器;
我们的实例是客户端访问服务端webservice接口要加权限认证。
我们思路先说下。我们可以通过在SOAP消息的Header头信息中添加自定义信息,然后发送到服务端端,服务器端通过获取
Header头消息,然后进行认证;这里的添加消息,和获取消息认证,我们都是通过自定义拦截器来实现;
首先是服务器端:
在server类里面添加红圈里面代码:
这里写图片描述

我们自定义拦截器:
这里写图片描述
在MyInterceptor类添加代码

package com.oyyp.interceptor;

import java.util.List;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
/*
*自定义拦截器
*
*/
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 header=headers.get(0);
        Element element=(Element) header.getObject();
        NodeList nodeName=element.getElementsByTagName("userName");
        NodeList nodePass=element.getElementsByTagName("passWord");
        if(nodeName.getLength()!=1){
            throw new Fault(new IllegalArgumentException("用户名格式不对")); 
        }
        if(nodePass.getLength()!=1){
            throw new Fault(new IllegalArgumentException("密码格式不对")); 
        }
        String userName=nodeName.item(0).getTextContent();
        String passWord=nodePass.item(0).getTextContent();
        if(!userName.equals("admin")||!passWord.equals("123456")){
            throw new Fault(new IllegalArgumentException("用户名或者密码错误")); 
        }
    }

}

这里的话,我们主要是获取Header头消息,然后获取userName和password节点,然后获取值,进行权限判断,假如认证不通过,我们抛出异常;

接下来是修改客户端代码:
我们同样要添加一个自定义拦截器:

这里写图片描述
在AddHeaderInterceptor类中添加代码:

package com.oyyp.interceptor;

import java.util.List;

import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

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("admin"),ele));
    }



}

这里的话,我们主要是在拦截器里创建头消息;

Client类里我们要修改下,加下Out 拦截器:
这里写图片描述
OK这样就完整了自定义拦截器实现权限认证;
先运行Server类,和以前一样;

假如我们把 client.getOutInterceptors().add(new AddHeaderInterceptor(“admin”,”123456”)); // 添加自定义拦截器

密码改成 123
然后运行客户端的Client类,会报错;
这里写图片描述
服务端的server类也会报错:
这里写图片描述
这说明用户名或者密码不正确;

如果正确的话就不会抛出异常运行如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值