`

基于Xfire SOAP Header的WebService安全验证教程

阅读更多

WebSerice是一种开放的web服务,任何人都可以访问,但我们有时候需要考虑只有付费用户才能使用WS,所以,我们就需要对WS加入安全验证机制,当然,可以利用防火墙的IP过滤,web应用的配置从最外层去隔离非法用户,但在内层,我们也可以使用SOAP Header的方式,由客户端发送验证数据,服务端验通过后基WS访问权限

首先配置WS Server和WS Client,其中Client端的测试代码类名由Client改为ClientTest,因为我们要用到Xfire的一个名为Client的类

首先我们编写服务端验证类继承AbstractHandler

package test;

import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;

public class AuthenticationHandler extends AbstractHandler {

    public void invoke(MessageContext cfx) throws Exception {
           if(cfx.getInMessage().getHeader() == null) {
               throw new org.codehaus.xfire.fault.XFireFault("请求必须包含验证信息",org.codehaus.xfire.fault.XFireFault.SENDER);
           }
           Element token=cfx.getInMessage().getHeader().getChild("AuthenticationToken");
           if (token == null)
           {
            throw new org.codehaus.xfire.fault.XFireFault("请求必须包含身份验证信息", org.codehaus.xfire.fault.XFireFault.SENDER);
           }

              String username = token.getChild("Username").getValue();
              String password = token.getChild("Password").getValue();
              try
              {
                  //进行身份验证 ,只有abcd@1234的用户为授权用户
                 if(username.equals("abcd") && password.equals("1234"))
                  //这语句不显示
                  System.out.println("身份验证通过");
                 else throw new Exception();
              }
              catch (Exception e)
              {
                  throw new   org.codehaus.xfire.fault.XFireFault("非法的用户名和密码",   org.codehaus.xfire.fault.XFireFault.SENDER);
              }

          }

 

}

下面是Client发送授权信息

为ClientTest.java加入以下代码

 XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);
Client client = proxy.getClient();
client.addOutHandler(new ClientAuthenticationHandler("abcd1","1234"));

等等,还没有完,修改Services.xm为WS绑定Handler

 

<?xml version="1.0" encoding="UTF-8"?>


<beans>
<service xmlns="http://xfire.codehaus.org/config/1.0">
<name>HelloService</name>
<namespace>http://test/HelloService</namespace>
<serviceClass>test.IHelloService</serviceClass>
<implementationClass>test.HelloServiceImpl</implementationClass>
 <inHandlers>
 <handler  handlerClass ="test.AuthenticationHandler" ></handler >
 </inHandlers>
</service>
</beans>

这样我们就完成了编码,下面启动tomcat,运行客户端代码,本文为abcd@1234位授权用户,使用abcd@1234,可以正常访问WS,如果用错误帐号,则会有以下异常

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: 非法的用户名和密码
org.codehaus.xfire.fault.XFireFault: 非法的用户名和密码
    at org.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)
    at org.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28)
    at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)
    at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)
    at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
    at org.codehaus.xfire.client.Client.onReceive(Client.java:406)
    at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)
    at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
    at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
    at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
    at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
    at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
    at org.codehaus.xfire.client.Client.invoke(Client.java:336)
    at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
    at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
    at $Proxy0.getUser(Unknown Source)
    at test.ClientTest.main(ClientTest.java:39)

如果不在CientTest加以下增加Heade则会有以下异常

 XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);
Client client = proxy.getClient();
 client.addOutHandler(new ClientAuthenticationHandler("abcd1","1234"));

Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: 请求必须包含验证信息
org.codehaus.xfire.fault.XFireFault: 请求必须包含验证信息
    at org.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)
    at org.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28)
    at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)
    at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)
    at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
    at org.codehaus.xfire.client.Client.onReceive(Client.java:406)
    at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)
    at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)
    at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)
    at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)
    at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)
    at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)
    at org.codehaus.xfire.client.Client.invoke(Client.java:336)
    at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)
    at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)
    at $Proxy0.getUser(Unknown Source)
    at test.ClientTest.main(ClientTest.java:35)

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/axzywan/archive/2009/06/24/4292732.aspx

分享到:
评论

相关推荐

    使用xfire框架搭建webService的一个demo

    本示例将详细解释如何利用xfire框架搭建一个包含SOAP Header身份验证和WS-Security身份验证的Web Service。 首先,让我们了解`xfire`。Xfire(现为Apache CXF的一部分)是一个开源的Java框架,它简化了创建和使用...

    webservice Soap和XFire2种方式代码列子

    综上所述,"webservice Soap和XFire2种方式代码列子"的压缩包可能包含使用SOAP协议和XFire框架创建Web服务的示例代码。通过学习这些代码,开发者可以更好地理解如何在Java环境中构建和消费SOAP服务,以及XFire在其中...

    .net调用java xfire发布的webservice封装soapheader头信息

    标题与描述均提到了“.NET调用Java XFire发布的WebService封装SOAPHeader头信息”,这是一个涉及跨平台服务调用的问题,具体来说是关于如何在.NET环境中调用由Java使用XFire框架发布的WebService,并正确处理...

    关于使用xfire创建webservice,并且使用消息头的示例

    在给定的“SoapHeader”文件中,可能包含了示例代码或者配置,演示了如何在XFire服务中使用SOAP消息头。这些示例通常会展示如何创建自定义消息头类,以及如何在XFire的配置中设置消息处理器。通过解析和理解这些示例...

    XFIRE webservice 开发实例

    XFIRE的Web Service通常基于SOAP协议,这是一种结构化的XML消息传递标准,用于在不同系统间交换数据。你需要熟悉SOAP请求的构造,包括Header部分(包含API密钥)和Body部分(包含具体的请求参数)。 3. **获取游戏...

    WebService与XFire

    **WebService与XFire** 在IT领域,WebService是一种基于开放标准(如XML、SOAP、WSDL和UDDI)的Web应用程序接口(API)设计模式,它允许不同系统间的互操作性,通过HTTP协议进行通信。WebService的核心技术包括简单...

    soapHeader验证例子

    WebService验证soapHeader.txt文件很可能是详细描述了如何配置MyEclipse项目,创建服务,设置SOAP Header,以及运行客户端和服务端的步骤。这份文档可能包含了XML Schema定义(XSD)文件,用于定义服务接口,以及...

    Webservice-CXF实用手册学习大全

    - soap消息格式:SOAP是WebService的消息格式,定义了消息的结构,包括头部(header)和主体(body)部分。 - 输入输出参数的注解:在JAX-WS中,使用注解来声明服务方法的输入输出参数,使得服务的开发更加直观。 ...

    WebService&SOA&ESB入门介绍(手把手xfire开发WS入门实例)

    WS-Security是Web Service安全标准,用于保护Web Service通信过程中的数据安全,包括身份验证、加密、完整性检查等。 【WS-Notification】 WS-Notification定义了一组协议,用于构建发布/订阅模型的事件通知系统,...

    android 调用webservice 有源码+jar

    本教程将详细介绍如何在Android环境中调用Webservice,并提供源码和jar包以供参考。主要涉及的技术点包括SOAP协议、HTTP通信以及接口调用。 1. **SOAP(Simple Object Access Protocol)协议** SOAP是一种轻量级的...

    深入浅出WebService

    在Java平台上,常见的WebService框架有Spring+XFire、Axis和CXF。本文重点讨论CXF,因为它是轻量级且易于扩展的。CXF实现了JAX-WS 2.0规范,可以无缝集成Spring框架,支持多种传输协议(如HTTP、JMS、Corba)和数据...

    Webservice接口快速开发指导

    - SOAP协议特性包括:可扩展性(通过SOAP扩展可以添加自定义功能)、平台和语言独立(基于XML),以及标准支持(如WSDL和UDDI)。 2. Web Service开发组件介绍 - WebService开发组件是实现Web Service接口的关键...

    WebService详解

    在Web开发领域,WebService是一种基于开放标准(如XML、SOAP、WSDL和UDDI)的,能够实现跨平台、跨语言通信的技术。它允许不同系统间的应用程序通过网络进行交互,实现了分布式计算的重要一环。本文档详细阐述了...

    webservice开发方式,报文修改

    在IT行业中,Web Service是一种基于网络的通信协议,允许不同系统之间进行数据交换。本文将深入探讨Web Service的开发方式,特别是针对报文修改和兼容性问题,以解决与第三方服务端对接时遇到的挑战。 首先,Web ...

    webService 资料包

    WebService是一种基于互联网的、平台和语言无关的接口定义和通信标准,它允许不同系统间的应用程序之间进行交互。WebService的核心是利用XML(可扩展标记语言)来描述服务,通过SOAP(简单对象访问协议)进行数据...

    webservice笔记

    SOAP消息由信封(Envelope)、头部(Header)和体部(Body)组成,其中信封用于标识消息的基本结构,头部包含消息处理的额外信息,体部则包含实际的数据或方法调用。 ##### 3. XML(Extensible Markup Language) ...

    webservice开发资料

    Web服务(Web Service)是一种基于互联网的、使用标准XML(Extensible Markup Language)进行通信的软件系统,允许不同平台的应用程序之间交换数据和执行操作。它利用SOAP(Simple Object Access Protocol)作为消息...

Global site tag (gtag.js) - Google Analytics