`
sungang_1120
  • 浏览: 322549 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

WebService CXF 日志拦截器和权限验证

 
阅读更多

要首先以有个接口:

 

@WebService
public interface MyWebService {
    int add(int a, int b);
}

实现类

@WebService(endpointInterface="com.sg.service.MyWebService",serviceName="MyService")
public class MyWebserviceImpl implements MyWebService {
    @Override
    public int add(int a, int b) {
        System.out.println(a+"+"+b+"="+(a+b));
        return a+b;
    }
}

 

发布服务端:

public class ServiceTest {
    public static void main(String[] args) {
        System.out.println("service start................");
        MyWebserviceImpl myWebserviceImpl = new MyWebserviceImpl();
        String address = "http://localhost:8089/myService";
        EndpointImpl endpointImpl = (EndpointImpl) Endpoint.publish(address, myWebserviceImpl);
        System.out.println("service end ..............");
        //日志进来的日志拦截器
        endpointImpl.getOutInterceptors().add(new LoggingOutInterceptor());
        //出去的
        endpointImpl.getInInterceptors().add(new LoggingInInterceptor());
    }
}

 

客户端:

//客户端
public class ClientTest {
    public static void main(String[] args) {
        //对应服务器端实现类
        //@WebService(endpointInterface="com.sg.service.MyWebService",serviceName="MyService")
        MyService myService = new MyService();
        //获取一个接口:服务器端的代理接口
        MyWebService myWebService = myService.getMyWebserviceImplPort();
       
        //获取cxf客户端服务类  通过cxf客户端代理类来获取
        //传入参数是:代理webservice服务端口
        Client client = ClientProxy.getClient(myWebService);
        //进入时日志记录
        client.getInInterceptors().add(new LoggingInInterceptor());
        //响应时日志记录
        client.getOutInterceptors().add(new LoggingOutInterceptor());
        //用户名 权限验证
        client.getOutInterceptors().add(new AddHeaderInterceptor("admin", "123456"));
       
        int add = myWebService.add(1, 1);
        System.out.println("add : "+add);
    }
}

定义服务端拦截器:

package com.sg.service;

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;


//服务器 验证权限
public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage>{
    public AuthInterceptor(){
        super(Phase.PRE_INVOKE);
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        List<Header> headers = message.getHeaders();
        //日过客户端没有传入SOAP包头文件时
        if (headers == null || headers.size() == 0) {
            //return 在这里不能实用  是错误的使用
            //没有权限的时候  怎样告诉客户端没有权限?抛异常
            throw new Fault(new IllegalAccessException("SAOP 包文件没有....."));
        }
        Header header = headers.get(0);
        System.out.println(header.getObject().getClass()+"******************************");
        Element element = (Element)header.getObject();
        String username = element.getElementsByTagName("username").item(0).getTextContent();
        String password = element.getElementsByTagName("password").item(0).getTextContent();
        System.out.println("***************************************************");
        if ("admin".equals(username) && "123456".equals(password)) {
            //验证成功
            //处理其他的业务逻辑 : 扣费
           
            System.out.println("===========处理其他的业务逻辑 : 扣费===========");
        }else {
            //验证失败
            throw new Fault(new RuntimeException("访问服务的用户名 或密码错误...."));
        }
    }
}

定义客户端拦截器:

package com.sg.client;

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);
        this.username = username;
        this.password = password;
    }
    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        //添加soap头信息 包含用户名  和 密码
        /**
         * <auth><username>admin</username><password>123456</password></auth>
         */
        Document document = DOMUtils.createDocument();
        Element authElement = document.createElement("auth");
        Element username = document.createElement("username");
        username.setTextContent(this.username);
        authElement.appendChild(username);
        Element password = document.createElement("password");
        password.setTextContent(this.password);
        authElement.appendChild(password);
       
        //第二个参数必须是Element对象
        Header header = new Header(new QName("com.sg.service"), authElement);
        message.getHeaders().add(header);
    }
}

 

测试结果显示:

客户端日志信息:
2013-1-24 23:44:14 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
信息: Creating Service {http://service.sg.com/}MyService from WSDL: http://localhost:8089/myService?wsdl
2013-1-24 23:44:15 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Outbound Message
---------------------------
ID: 1
Address: http://localhost:8089/myService
Encoding: UTF-8
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header>
    <auth>
        <username>admin</username>
        <password>123456</password>
    </auth>
</soap:Header><soap:Body><ns2:add xmlns:ns2="http://service.sg.com/"><arg0>1</arg0><arg1>1</arg1></ns2:add></soap:Body></soap:Envelope>
--------------------------------------
2013-1-24 23:44:15 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Response-Code: 200
Encoding: UTF-8
Content-Type: text/xml;charset=UTF-8
Headers: {Content-Length=[197], content-type=[text/xml;charset=UTF-8], Server=[Jetty(7.4.2.v20110526)]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:addResponse

xmlns:ns2="http://service.sg.com/"><return>2</return></ns2:addResponse></soap:Body></soap:Envelope>
--------------------------------------
add : 2
服务器端日志信息:

2013-1-24 23:44:14 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 1
Address: http://localhost:8089/myService?wsdl
Http-Method: GET
Content-Type: text/xml
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], content-type=[text/xml], Host=[localhost:8089], Pragma=[no-cache], User-Agent=[Apache CXF

2.4.1]}
--------------------------------------
2013-1-24 23:44:15 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Inbound Message
----------------------------
ID: 2
Address: http://localhost:8089/myService
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml; charset=UTF-8
Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[284], content-type=[text/xml; charset=UTF-8], Host=[localhost:8089],

Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 2.4.1]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header>
    <auth>
        <username>admin</username>
        <password>123456</password>
    </auth>
</soap:Header><soap:Body><ns2:add xmlns:ns2="http://service.sg.com/"><arg0>1</arg0><arg1>1</arg1></ns2:add></soap:Body></soap:Envelope>
--------------------------------------
1+1=2
2013-1-24 23:44:15 org.apache.cxf.interceptor.AbstractLoggingInterceptor log
信息: Outbound Message
---------------------------
ID: 2
Encoding: UTF-8
Content-Type: text/xml
Headers: {}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:addResponse

xmlns:ns2="http://service.sg.com/"><return>2</return></ns2:addResponse></soap:Body></soap:Envelope>
--------------------------------------

分享到:
评论

相关推荐

    CXF WebService带有拦截器

    总结起来,"CXF WebService带有拦截器"的实践是Web服务开发中的一个重要方面,它允许我们在不侵入核心业务逻辑的情况下,增加诸如权限控制这样的安全特性。通过"AuthFilter_Service"和"AuthFilter_Client",我们可以...

    webservice的cxf框架拦截器demo

    在实际应用中,除了自定义拦截器,还可以利用CXF提供的内置拦截器,如LoggingInInterceptor和LoggingOutInterceptor,用于日志记录,或者AddressingInInterceptor和AddressingOutInterceptor,用于处理WS-Addressing...

    CXF使用EndpointImpl发布WebService加入拦截器

    在Java世界中,Apache CXF是一个广泛使用的开源框架,它允许开发者创建和消费Web服务。在Web服务开发中,拦截器扮演着至关重要的角色,...总的来说,理解并熟练运用CXF拦截器对于任何CXF开发者来说都是一项重要的技能。

    13.为CXF与Spring整合发布WebService添加拦截器进行权限控制

    首先,我们需要理解CXF拦截器的概念。拦截器是CXF提供的一种机制,它允许我们在Web服务调用的生命周期中的不同阶段插入自定义逻辑,如消息的发送和接收。这为我们提供了在服务执行前、后或过程中进行额外操作的机会...

    WebService之自定义拦截器(server+client)

    在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而WebService之自定义拦截器的实现,无论是对于服务器端还是客户端,都是为了增强服务的功能性和安全性。本文将深入探讨自定义拦截器的概念、作用以及...

    webservice的cxf框架拦截器demo.rar

    【描述】:本压缩包“webservice的cxf框架拦截器demo.rar”提供了一个关于如何在Apache CXF框架下实现Web服务拦截器的实际操作示例。CXF是一个开源的服务框架,它允许开发者创建和部署多种类型的Web服务,包括SOAP和...

    CXF发布WebService加入拦截器

    在Java世界中,Apache CXF是一个广泛使用的开源框架,它允许开发者创建和消费Web服务。当我们谈论"CXF发布WebService加入拦截器...通过阅读和分析给定的压缩包文件,你可以学习到更多关于CXF拦截器的具体实现和用法。

    CXF-拦截器-权限控制-登录校验

    本文将深入探讨"CXF拦截器-权限控制-登录校验"这一主题。 首先,我们需要了解什么是拦截器。在CXF框架中,拦截器是实现业务逻辑和基础架构之间解耦的一种方式。它们可以插入到服务调用的生命周期中,在消息发送前或...

    CXF打印SOAP报文,记录WebService日志

    ### CXF打印SOAP报文与记录WebService日志 在企业级应用开发中,尤其是涉及到服务端接口(如...此外,通过扩展此类自定义拦截器,还可以添加更多的功能,如安全性验证、性能监控等,以满足更复杂的应用场景需求。

    11.为CXF客户端添加自定义拦截器完成权限控制

    拦截器是一种设计模式,它允许在方法调用前后执行额外的操作,比如日志记录、事务管理或如这里的权限检查。在CXF中,拦截器可以插入到消息处理管道中,对请求和响应进行处理。 要为CXF客户端添加自定义拦截器,我们...

    10.为CXF服务器端添加自定义拦截器进行权限检查

    在开发基于CXF的Web服务时,为了确保系统的安全性和数据的完整性,通常需要对请求进行权限检查。本文将深入探讨如何为CXF服务器...在学习和应用这些知识时,结合实际案例和实践操作将有助于更好地掌握CXF拦截器的使用。

    CXF3.1.16 +Spring4 +MyBatis + Maven自定义拦截器 WebService实例源码下载

    【标题解析】 ...这个项目提供了从设计、实现到测试Web服务的完整示例,对于学习和理解CXF、Spring、MyBatis和Maven的集成,以及如何在Web服务中实现自定义拦截器和安全验证机制,具有很高的参考价值。

    java代理实现webservice接口拦截器功能

    本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。

    CXF拦截器(Interceptor)的使用

    通过上述分析,我们可以看出CXF拦截器机制的深度和广度。它不仅提供了强大的功能扩展能力,还通过精心设计的API保证了系统的灵活性、可维护性和性能。对于希望利用CXF构建高度定制化Web服务的开发者而言,深入理解和...

    webservice拦截器demo-服务端和调用端

    WebService拦截器是一种在服务端和客户端之间增强或修改服务行为的技术。在Web服务的世界里,拦截器扮演着中间件的角色,允许我们在调用服务之前或之后执行自定义逻辑,如日志记录、性能监控、安全检查等。在这个...

    08.CXF拦截器的理论以及如何为CXF的客户端和服务器端添加拦截器

    **CXF拦截器理论与应用** 在Web服务领域,Apache CXF是一个强大的开源框架,它提供了构建和消费SOAP和RESTful服务的能力。拦截器是CXF框架中的一个重要组成部分,允许开发者在服务调用的生命周期中插入自定义逻辑,...

    使用cxf的webservice安全验证

    例如,开发者可能会在CXF的wsdl2java工具生成的代码中添加安全相关的注解,或者在Spring配置文件中定义安全拦截器和策略。同时,可能还需要配置Keystore和Truststore来支持SSL/TLS连接,或者配置认证和授权的提供者...

    CXF自定义拦截器实现安全机制实例工程

    CXF 自定义拦截器实现的 webservice安全机制实例工程, 带jar包 ,代码注释详细 内有说明文档, 由于资源过大 ,所以客户端jar包 删除掉了, 只需要把服务端的jar 拷贝到 客户端即可 , 小弟刚刚研究完 CXF 安全 。...

    CXF 2.4 WebService 发布和调用的身份验证和获取示例代码

    其中配置了对传入请求的拦截器用以验证调用者身份 验证程序: WsServerAuthHandler. 这里只需要提供调用者应该使用的正确的口令. 是否和调用者实际传入的口令一致,由cxf完成. web.xml ------------------------- ...

    springBoot完整整合WebService框架CXF示例

    5. **CXF拦截器**:CXF拦截器是处理消息传递过程中的钩子,可以在消息发送前、发送后、接收前、接收后等阶段进行操作。在这个示例中,拦截器用于实现简单的授权校验。你可以定义一个实现了`ClientInterceptor`或`...

Global site tag (gtag.js) - Google Analytics