Apache CXF自定义拦截器

为什么设计拦截器?
1.为了在webservice请求过程中,能动态操作请求和响应数据,CXF设计了拦截器
拦截器分类:
1.按所处的位置分:服务器端拦截器,客户端拦截器。
2.按消息的方向分:入拦截器,出拦截器。
3.按定义者分:系统拦截器,自定义拦截器。

客户端添加日志拦截器

package com.client.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 AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{

    private String name;
    private String password;
    /**
     *
     * @param name
     * @param password
     */

    public AddUserInterceptor(String name,String password) {
        super(Phase.PRE_PROTOCOL);//准备协议化时拦截
        // TODO Auto-generated constructor stub
        this.name=name;
        this.password=password;
    }

    @Override
    public void handleMessage(SoapMessage msg) throws Fault {
        // TODO Auto-generated method stub
        List<Header> headers = msg.getHeaders();

        Document document = DOMUtils.createDocument();
        Element rootEle = document.createElement("apple");
        Element nameEle = document.createElement("name");
        nameEle.setTextContent(name);
        rootEle.appendChild(nameEle);

        Element passwordEle = document.createElement("password");
        passwordEle.setTextContent(password);
        rootEle.appendChild(passwordEle);

        headers.add(new Header(new QName("apple"), rootEle));
        System.out.println("client handMwssage()....");
    }

}

服务器端拦截器:

package com.service.interceptor;

import javax.xml.namespace.QName;

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;

public class CheckUser extends AbstractPhaseInterceptor<SoapMessage>{

    public CheckUser() {
        super(Phase.PRE_PROTOCOL);
        // TODO Auto-generated constructor stub
    }   

    /*
    <Envelope>
        <head>
            <apple>
                <name>bo ram</name>
                <password>520</password>
            <apple>
        </head>
        <Body>
            <favorite>
                <arg0>Tara</arg0>
            <favorite>
        </Body>
    </Envelope>
     */

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        // TODO Auto-generated method stub
        Header header = message.getHeader(new QName("apple"));
        if(header!=null){
            Element appleEle=(Element) header.getObject();
            String name = appleEle.getElementsByTagName("name").item(0).getTextContent();
            String password = appleEle.getElementsByTagName("password").item(0).getTextContent();
            if("bo ram".equals(name)&&"520".equals(password)){
                System.out.println("Server 通过拦截器");
                return;
            }
        }

        System.out.println("server 没有通过拦截器。。。。。");
        throw new Fault(new Exception("请求需要一个正确的用户名和密码"));
    }

}

客户端

package com.cxf_client.client;

import java.util.List;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;

import com.client.interceptor.AddUserInterceptor;
import com.client.simple3.Simple;
import com.client.simple3.SimpleimplService;

public class Simpleclient2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
            SimpleimplService simpleimplService = new SimpleimplService();
             Simple simpleimplPort = simpleimplService.getSimpleimplPort();
             //发送请求的客户端数据
             Client client = ClientProxy.getClient(simpleimplPort);
             //客户端出拦截器
             List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();
             outInterceptors.add(new AddUserInterceptor("bo ram", "520"));
//             //客户端入拦截器
//             List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors();
//             inInterceptors.add(new LoggingInInterceptor());

             String favorite = simpleimplPort.favorite("Tara");
             System.out.println(favorite);

    }

}

服务端

package com.service.server;

import java.util.List;

import javax.xml.ws.Endpoint;

import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws22.EndpointImpl;
import org.apache.cxf.message.Message;

import com.service.impl.Simpleimpl;
import com.service.interceptor.CheckUser;

public class SimpleServer2 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String address="http://localhost:8848/simpleserver/simple";
            Endpoint publish = Endpoint.publish(address, new Simpleimpl());
            EndpointImpl endpointimpl=(EndpointImpl) publish;
            //服务端入拦截器
            List<Interceptor<? extends Message>> inInterceptors = endpointimpl.getInInterceptors();
            inInterceptors.add(new CheckUser());
//            //服务端出拦截器
//            List<Interceptor<? extends Message>> outInterceptors = endpointimpl.getOutInterceptors();
//            outInterceptors.add(new LoggingOutInterceptor());

            System.out.println("published");
    }

}
时间: 2024-12-18 17:31:41

Apache CXF自定义拦截器的相关文章

CXF 自定义拦截器

------要想添加一个拦截器,目的是调用之前做一个认证,也就是说不是所有的请求都能调用,这样就可以验证了,更安全. 1     在服务端写一个拦截器,public class MyInterceptor extends AbstractPhaseInterceptor<SoapMessage>  ,要给一个构造方法(可以确定是什么时候执行这个拦截器,Phase.PRE_INVOKE就是调用之前执行),重写handleMessage方法,因为信息在请求头里面,所以这个方法中有一些解析XML的A

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

CXF拦截器是功能的主要实现单元,也是主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加功能.当服务被调用时,会经过多个拦截器链(Interceptor Chain)处理,拦截器链在服务输入(IN)或输出(OUT)阶段实现附加功能,拦截器可以在客户端加入,也可以在服务端加入. 拦截器链的阶段: 拦截器链有多个阶段,每个阶段都有多个拦截器.拦截器在拦截器链的哪个阶段起作用,可以在拦截器的构造函数中声明. 输入拦截器链有如下几个阶段,这些阶段按照在拦截器链中的先后顺序排列. 阶段名称 阶段功

WebServices中使用cxf开发日志拦截器以及自定义拦截器

首先下载一个cxf实例,里面包含cxf的jar包.我下的是apache-cxf-2.5.9 1.为什么要设置拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. 2.拦截器分类 1. 按所处的位置分:服务器端拦截器,客户端拦截器 2. 按消息的方向分:入拦截器,出拦截器 3. 按定义者分:系统拦截器,自定义拦截器 3.拦截器API Interceptor(拦截器接口) AbstractPhaseInterceptor(自定义拦截器从此继承) Loggi

WebService学习笔记-CXF添加拦截器

Webservice拦截器:在webservice请求过程中,动态操作请求和响应的数据 分类 按照所处的位置分:服务器端拦截器  客户端拦截器 按照消息的方向分:入拦截器  出拦截器 按照定义者分:系统拦截器 自定义拦截器 在服务器端添加拦截器 package com.demo; //注意引入的类一定要正确 import javax.xml.ws.Endpoint; import org.apache.cxf.interceptor.LoggingInInterceptor; import or

WebService学习笔记-CXF添加自定义拦截器

使用自定义拦截器实现用户名和密码的校验 客户端:出拦截器 服务器:入拦截器 客户端 AddUserInterceptor.java package com.demo.interceptors; import java.util.List; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.headers.Header; import org

cxf添加拦截器应用

项目中有时候也会做一些类似于权限验证的东西,拦截器也是一种实现方式.拦截器主要作用是做一些权限过滤,编码处理等. webService接口也可以上拦截器,我们也可以给webservice请求加权限判断功能: webservice分服务端和客户端,服务端和客户端都是可以加拦截器的,无论是服务端还是客户端,都分进,出(In,Out)拦截器: 可以使用cxf内置拦截器,也可以自定义拦截器,无论是自定义的拦截器,还是CXF自带的拦截器,都必须实现Interceptor接口. 下面分别从这两个方面来讲解:

struts2基础----&gt;自定义拦截器

这一章,我们开始struts2中拦截器的学习.内容较浅,慎看. 自定义拦截器 一.增加一个自定义的拦截器为类 package com.huhx.interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class RegisterInterceptor extends AbstractInt

struts2 文件的上传下载 表单的重复提交 自定义拦截器

文件上传中表单的准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置为 post 需添加 <input type=“file”> 字段. Struts 对文件上传的支持 在 Struts 应用程序里, FileUpload 拦截器和 Jakarta Commons FileUpload 组件可以完成文件的上传. 步骤:1. 在 Jsp 页面的文件上传表单里使用

springMVC --拦截器流程详细,使用和自定义拦截器

先看看拦截器都做些什么: 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(PageView)等. 2.权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面: 3.性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录): 4.通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Loca