CXF 自定义拦截器

Posted 编世界

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CXF 自定义拦截器相关的知识,希望对你有一定的参考价值。

------要想添加一个拦截器,目的是调用之前做一个认证,也就是说不是所有的请求都能调用,这样就可以验证了,更安全。

 

1     在服务端写一个拦截器,public class MyInterceptor extends AbstractPhaseInterceptor<SoapMessage>  ,要给一个构造方法(可以确定是什么时候执行这个拦截器,Phase.PRE_INVOKE就是调用之前执行),重写handleMessage方法,因为信息在请求头里面,所以这个方法中有一些解析XML的API,什么getElementByTagName  什么的。

package com.java1234.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 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("用户名或者密码错误!"));
        }
    }

}

2    客户端调用的时候,那就也要写一个拦截器了,目的是往请求头里面添加认证信息(用户名密码),和服务端相似,也要给一个构造方法,重写handleMessage方法。这时候的handleMessage方法就是要往请求头里添加信息。

package com.java1234.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("java1234"),ele));
        
    }
    
    

}

 3   上面的拦截器写好了,客户端具体怎么用呢--------获取client   把拦截器设置进去。

package com.java1234.webservice;

import java.util.List;

import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;

import com.java1234.interceptor.AddHeaderInterceptor;

public class Client {

    public static void main(String[] args) {
        HelloWorldService service=new HelloWorldService();
        HelloWorld helloWorld=service.getHelloWorldPort();
        org.apache.cxf.endpoint.Client client=ClientProxy.getClient(helloWorld);
        
        client.getOutInterceptors().add(new AddHeaderInterceptor("java1234","123456")); // 添加自定义拦截器
        client.getInInterceptors().add(new LoggingInInterceptor()); // 添加In拦截器 日志拦截器
        client.getOutInterceptors().add(new LoggingOutInterceptor()); // 添加Out拦截器 日志拦截器

        
        /*User user=new User();
        user.setUserName("jack");
        user.setPassword("123456");
        List<Role> roleList=helloWorld.getRoleByUser(user);
        for(Role role:roleList){
            System.out.println(role.getId()+","+role.getRoleName());
        }*/
        
        MyRoleArray arry=helloWorld.getRoles();
        List<MyRole> roleList=arry.item;
        for(int i=0;i<roleList.size();i++){
            MyRole my=roleList.get(i);
            System.out.print(my.key+":");
            for(Role r:my.value){
                System.out.print(r.getId()+","+r.getRoleName());
            }
            System.out.println("============");
        }
    }
}

 

以上是关于CXF 自定义拦截器的主要内容,如果未能解决你的问题,请参考以下文章

CXF 自定义拦截器

CXF拦截器介绍及自定义拦截器实现

CXF拦截器介绍及自定义拦截器实现

CXF拦截器介绍及自定义拦截器实现

cxf在服务器定义input拦截器功能

WebService -- Java 实现之 CXF ( 添加系统预定义的拦截器)