WebService拦截器的使用

WebService自定义拦截器只需要继承AbstractPhaseInterceptor即可

编写自定义拦截器之后,需要在发布的类和调用类中添加拦截器,分布使用JaxWsServerFactoryBean实例.getInInterceptors().add(自定义拦截器实例);和

JaxWsProxyFactoryBean.getOutInterceptors().add(自定义拦截器实例),进行拦截器的添加。

一个简单的用户验证的拦截器,具体的代码如下:

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

服务端代码:

package com.tabchanj.cxf.service;

import javax.jws.WebService;
/**
 * 服务接口
 * @author tab
 *
 */
@WebService
public interface HelloService {
    String sayHi(String name);
}
package com.tabchanj.cxf.service;

import javax.jws.WebService;
/**
 * 服务接口实现
 * @author tab
 *
 */
@WebService(endpointInterface = "com.tabchanj.cxf.service.HelloService")
public class HelloServiceImpl implements HelloService {
    public String sayHi(String name) {
        System.out.println(name + "你好,吃了吗?");
        return name + "你好,吃了吗?";
    }
}
package com.tabchanj.cxf.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;
/**
 * 服务端用户名验证拦截器
 * @author tab
 *
 */
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

    public AuthInterceptor() {
        super(Phase.PRE_INVOKE);
    }

    public void handleMessage(SoapMessage message) throws Fault {
        // 获取header
        List<Header> headers = message.getHeaders();
        if (headers == null || headers.size() == 0) {
            throw new Fault(new IllegalArgumentException("用户验证信息不能为空"));
        }
        Header header = headers.get(0);
        Element authinfo = (Element) header.getObject();
        String username = authinfo.getElementsByTagName("username").item(0).getTextContent();
        String password = authinfo.getElementsByTagName("password").item(0).getTextContent();
        System.out.println("username:"+username+"================password:"+password);
        if (!("admin".equals(username) && "0".equals(password))) {
            throw new Fault(new IllegalArgumentException("用户验证信息错误"));
        }
    }
}
package com.tabchanj.cxf.service;

import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

import com.tabchanj.cxf.interceptor.AuthInterceptor;
/**
 * 服务发布
 * @author tab
 *
 */
public class Publish {
    public static void main(String[] args) {
        // 创建JaxWsServiceFactoryBean对象
        JaxWsServerFactoryBean bean = new JaxWsServerFactoryBean();
        // s设置发布地址
        bean.setAddress("http://192.168.1.3:9119/hi");
        // 设置服务发布的接口
        bean.setServiceClass(HelloService.class);
        // 设置服务的发布对象
        bean.setServiceBean(new HelloServiceImpl());
        // ===================拦截器=====================
        bean.getInInterceptors().add(new LoggingOutInterceptor());// 配置日志记录拦截器
        bean.getInInterceptors().add(new AuthInterceptor());// 配置用户权限拦截器
        // ===================拦截器=====================
        // 发布
        bean.create();
        System.out.println("发布成功");
    }
}

客户端代码:

package com.tabchanj.cxf.interceptor;

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;
/**
 * 客户端拦截器,用于将用户信息封装到WSDL的header中
 * @author tab
 *
 */
public class LicenseInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
    private String username;
    private String password;

    public LicenseInterceptor(String username, String password) {
        super(Phase.PREPARE_SEND);//表示在向服务端发送消息之前执行本拦截器
        this.username = username;
        this.password = password;
    }

    public void handleMessage(SoapMessage message) throws Fault {
        // 获取用户数据
        // 将数据封装到header中
        // 建立header的xml结构
        Document document = DOMUtils.createDocument();
        Element authinfoEl = document.createElement("authinfo");
        Element usernameEl = document.createElement("username");
        Element passwordEl = document.createElement("password");

        usernameEl.setTextContent(username);
        passwordEl.setTextContent(password);

        authinfoEl.appendChild(usernameEl);
        authinfoEl.appendChild(passwordEl);
        // 将xml结构添加到header中
        message.getHeaders().add(new Header(new QName("xx"), authinfoEl));
    }
}
package com.tabchanj.cxf.service;

import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.junit.Test;

import com.tabchanj.cxf.interceptor.LicenseInterceptor;

/**
 * 客户端的服务调用类
 *
 * @author tab
 *
 */
public class Call {

    @Test
    public void test() {
        // 1.创建JaxWsProxyFactoryBean的对象,用于接收服务
        JaxWsProxyFactoryBean proxy = new JaxWsProxyFactoryBean();
        // 2.设置服务的发布地址,表示去哪里过去服务
        proxy.setAddress("http://192.168.1.3:9119/hi");
        // 3.设置服务的发布接口,使用本地的代理接口
        proxy.setServiceClass(HelloService.class);
        // --------------------------------拦截器-----------------------------------------
        proxy.getOutInterceptors().add(new LoggingOutInterceptor());// 日志记录拦截器
        proxy.getOutInterceptors().add(new LicenseInterceptor("admin", "0"));// 配置客户端用户信息配置拦截器
        // -------------------------------------------------------------------------
        // 4.通过create方法返回接口代理实例
        HelloService service = (HelloService) proxy.create();
        // 5.调用远程方法
        System.out.println(service.sayHi("tom"));
    }
}
时间: 2024-10-14 00:56:06

WebService拦截器的使用的相关文章

7.添加基于Spring的WebService拦截器

客户端拦截器: public class AccountInterceptor extends AbstractPhaseInterceptor<SoapMessage>{ private String name; private String password; public AccountInterceptor(String name,String password) { //Phase值决定了拦截器什么时候拦截到消息 //PRE_PROTOCOL准备请求时拦截 super(Phase.P

webservice拦截器

CXF的拦截器 理解 为什么设计拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. 拦截器分类: 按所处的位置分:服务器端拦截器,客户端拦截器 按消息的方向分:入拦截器,出拦截器 按定义者分:系统拦截器,自定义拦截器 基于jdk的webservice没有拦截器的功能实现. 接口方法: import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interfac

5.webService拦截器

CXF为什么要设计拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. 拦截器分类 1.按所处的位置分:服务器端拦截器,客户端拦截器 2.按消息的方向分:入拦截器,出拦截器 3.按定义者分:系统拦截器,自定义拦截器 3.1系统拦截器: LoggingInInterceptor(系统日志入拦截器类) LoggingOutInterceptor(系统日志出拦截器类) ***server*** //SEI @WebService public interfa

webservice拦截器 查看消息包(soap)

服务端: 1.获取EndpointImpl对象 2.调用EndpointImpl对象中的方法获取In拦截器 3.调用EndpointImpl对象中的方法获取out拦截器 4.添加自己的In拦截器与Out拦截器 LogginInInterceptor:查看收到的消息包 LoggOutInterceptor:查看发出去的消息包 客户端: 需要导入cxf的7个jar包: 1.获取client对象 Client client=ClientProxy.getClient("ws服务组件代理对象"

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

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

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

1. 概述 CXF允许我们在webservice的in/out位置添加拦截器.拦截器有两大分类,一类是系统预定义的:另一类是自定义拦截器. 2. 在server端添加拦截器. JaxWsServerFactoryBean wsSvrFactoryBean = new JaxWsServerFactoryBean(); String address = "http://127.0.0.1/helloWorld"; wsSvrFactoryBean.setAddress(address);

基于CXF框架的webservice简单的SC两端出入拦截器实现。

开发工具:  ECLIPSE(EE) + CXF(2.5.9) (I)可以现在eclipse中使用JDK来创建webservice基础服务.(没有CXF框架的webservice) (1)新建一个java project. (命名为FirstWebService) 新建一个interface接口.改接口就是相当于webservice中的SEI. (在接口类定义前使用JDK自带webservice注释[email protected] SEI方法则是使用@WebMethod生命方法.) (2)在定

构建基于CXF的WebService服务(3)-- 利用拦截器实现权限验证

CXF中的拦截器分为in拦截器和out拦截器,又有客户端拦截器和服务端拦截器. 拦截器使用流程:客户端(out)-> 服务端(in)->处理业务->服务端(out)->客户端(in),并不是每一步都需要拦截器.在这里我们用到的是客户端Out拦截器和服务端in拦截器.服务端in拦截器检查用户级权限,客户端out浏览器发送用户信息给服务端. 1.创建服务端验证 JaxWsServerFactoryBean或Endpoint都可以通过getInInterceptors方法,向WebSer

【WebService】CXF拦截器的设置以及自定义CXF拦截器

WebService系列文章: [WebService]带你走进webservice的世界 [WebService]自定义WebService服务及其调用 [WebService]wsdl配置详解以及使用注解修改wsdl配置 [WebService]CXF处理javaBean等复合类型以及Map等复杂类型的数据 CXF的拦截器和以前学过的servlet的拦截器类似的,都是在开始或结束切入一段代码,执行一些逻辑之类的.我们可以在调用ws服务前设置拦截器,也可以在调用ws服务后设置拦截器,当然了,拦