`

XFire Web Service验证方案

阅读更多
XFire的文档做的真是相当的烂,非常不详细,看得匪夷所思,而且和发行的代码版本相当的不匹配,里面的示例根本无法运行,看得真是……相当窝火

 

公司项目XFire的服务框架我已经做好,这两天就要加入验证功能,而且要和整体权限框架(还没做)相结合
开始想通过HttpSession验证,这样可以很方便的和b/s的权限系统相统一,但实在不知道如何在客户端通过Spring或XFire访问HttpSession,XFire里的文档倒是提到了:
HttpServletRequest request = XFireServletController.getRequest();
HttpServletResponse response = XFireServletController.getResponse();

并且说只要在web.xml里配置XFireSpringServlet就可以,可是按照配了,结果还是不行
注:axis好像是有MessageContext可以很方便的访问到,xfire里也有MessageContext,可是getSession()出来的是null
如果有高手知道如何做还望麻烦告知

此条路不通只好去查XFire的文档关于authentication部分,大概有以下几种方案:
  1. HTTP Authentication
  2. SOAP Header authentication with JSR181
  3. SOAP authentication with handlers
  4. WS-Security
其中第一条HTTP Authentication的文档写的相当匪夷所思,文档写到如何在客户端指定用户名和密码
// Create your client
Client client = ....;

// Or get it from your proxy
Client client = ((XFireProxy) Proxy.getInvocationHandler(myClientProxy)).getClient(); 

client.setProperty(Channel.USERNAME, "username");
client.setProperty(Channel.PASSWORD, "pass");

去忘了写服务端应该怎么做,这个username和password该在那里验证呢??我翻遍了文档也没找着


来看第二条SOAP header authentication with JSR181,看起来倒是很简单

但是在Service的代码中每个方法里都要写一个UserToken验证的参数,虽然似乎权限粒度能控制得很细,但是这严重污染了业务逻辑的代码,非常的不优雅,放弃!

 

public void someOperation(String data, @WebParam(header=true) UserToken token) {
authenticate(token)

// do your normal request here
}

再看WS-Security,这是webservice的安全标准,但实在太复杂了,并且需要配置Service.xml,我们项目是Java1.5,Service.xml根本就没有写,是自动生成的,我是实在找不到Service.xml该在那配置?只好作罢

 

现在只剩下SOAP authentication with handlers,根据文档来看这是能够满足我的要求的,不侵入业务逻辑,能够和整体权限系统相结合,并且配置比较简单
把例子里的代码拷过来,发现根本不能用,少了yom这个包,在网上找了很久也没找到,后来发现yom其实就是yet(another) document object model,原来和dom是一回事嘛,用jdom替换,编译通过。

文档里遗漏了很重要的一点,就是关于如何在xfire-servlet里配置,导致很多人看了文档也进行不下去,我查了很久才在老外的一篇blog里找到一点tips,下面是配置:
    <!-- WebService base, do not modify it -->
    <bean id="webService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true">
        <property name="serviceFactory">
            <ref bean="xfire.serviceFactory" />
        </property>
        <property name="xfire">
            <ref bean="xfire" />
        </property>
    </bean>

    <bean id="yourWebService" parent="webService">
        <property name="serviceBean">
            <ref bean="yourService" />
        </property>
        <property name="serviceClass">
            <value>your.package.YourServiceInterface</value>
        </property>
        <property name="inHandlers">
            <ref bean="authenticationHandler"/>
        </property>
    </bean>

AuthenticationHandler需要修改一下,其他不用变:

AuthenticationHandler.java

import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.codehaus.xfire.fault.*;
import org.jdom.*;

public class AuthenticationHandler extends AbstractHandler {
    private static final Logger log = Logger.getLogger(AuthenticationHandler.class);
   
    public void invoke(MessageContext context) throws Exception {
        log.info("authentication handler is invoked");
        if (context.getInMessage().getHeader() == null)
        {
            throw new XFireFault("Request must include company authentication token.",
                                 XFireFault.SENDER);
        }
        Element header = context.getInMessage().getHeader();
        Element token = header.getChild("AuthenticationToken");
       
        if (token == null)
        {
            throw new XFireFault("Request must include authentication token.",
                                 XFireFault.SENDER);
        }

        String username = token.getChild("Username").getText();
        String password = token.getChild("Password").getText();

        try {
            // 现在你已经得到了客户端传来的username和password,那就验证它吧(可以交给acegi来验证)
            }

        }catch(Exception e) {
            log.warn(e);
            throw new XFireFault("Authentication Failed.",
                    XFireFault.SENDER);
        }
    }
}

客户端代码:

            Service serviceModel = new ObjectServiceFactory().create(YourService.class);
            YourService service = (YourService) new XFireProxyFactory().create(serviceModel,
                 "http://localhost:8080/YourProject/service/YourService");
            XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);
            Client client = proxy.getClient();
            client.addOutHandler(new ClientAuthHandler("jeffrey", "killjava"));
            // 执行下面代码会进行验证
            service.someOperation();

 

分享到:
评论

相关推荐

    8 XFire Web Service 入门.doc

    【XFire Web Service 入门】 XFire 是一个开源的、高性能的Java Web Service框架,它简化了创建和消费Web服务的过程。XFire在早期是Apache CXF的一部分,后来并入了CXF项目,提供了丰富的功能,包括SOAP、WS-*协议...

    myeclipse XFire Web service 例子

    【标题】:myeclipse XFire Web service 例子 【正文】: 在IT行业中,Web服务是一种基于互联网的标准协议,允许不同系统之间进行通信和数据交换。XFire是Apache CXF项目的前身,它是一个高性能、轻量级的Java Web...

    XFire Web Service.pdf

    ### XFire Web Service知识点详解 #### 一、概述 XFire Web Service 是一款基于 Java 的 SOAP(Simple Object Access Protocol)框架,用于构建高效且可扩展的 Web 服务。本章节详细介绍了如何使用 XFire 在 ...

    第15章 开发XFire Web Service应用.pdf

    ### 第15章 开发XFire Web Service应用 #### 15.1 引言 ##### 15.1.1 WebService简介 WebService(Web服务)是一项最初由微软和IBM提出的技术规范,旨在实现不同编程语言之间的网络功能互通互联。它的核心特性...

    第十五章 开发XFire Web Service应用.pdf

    ### 第十五章 开发XFire Web Service应用 #### 15.1 引言 ##### 15.1.1 WebService简介 WebService(通常译作Web服务)是由微软和IBM等公司共同提出的一项技术规范,它允许在互联网上通过标准的协议(如HTTP)...

    第十五章 开发XFire Web Service应用22.pdf

    ### 第十五章 开发XFire Web Service应用22.pdf 知识点解析 #### 15.1 引言 ##### 15.1.1 WebService简介 WebService,中文通常译为Web服务,最初由IBM和微软共同提出的技术规范。它的核心在于提供一个标准化的...

    xfire开发web service文档.rar

    在文件列表中,"xfire开发web service文档.doc"可能是主文档,包含了整个教程的详细内容,包括理论解释、示例代码、步骤指南和可能的截图,以帮助读者逐步学习和实践使用XFire创建Web服务。 总的来说,这个压缩包...

    MyEclipse+xFire开发Web Service

    【MyEclipse+xFire开发Web Service】是一个关于如何使用MyEclipse集成开发环境和xFire框架来构建和测试Web服务的教程。xFire是一个基于Java的SOAP框架,它提供了轻量级的信息处理机制,利用STAX进行SOAP消息处理。这...

    Web Service框架xfire与spring集成开发流程

    Web Service框架XFire是新一代的解决方案,旨在简化Web Service应用的开发,与Axis 2一同成为业界关注的焦点。XFire以其简洁的API设计,全面支持Web Service的各种标准协议,如SOAP、WSDL和WS-Security等,极大地...

    使用XFire+Spring构建Web Service

    7. **测试Web Service**:可以使用各种工具(如SoapUI)或者自定义客户端代码来调用Web Service,验证其功能是否正常。 在提供的压缩包"webservice_helloworld"中,可能包含了示例代码,包括了上述步骤的实现。这个...

    Xfire配置Web Service+Spring+Hibernate详细配置流程

    以下是关于"Xfire配置Web Service+Spring+Hibernate详细配置流程"的知识点详解: 1. **Spring框架**: Spring是Java企业级应用开发的首选框架,提供依赖注入(DI)和面向切面编程(AOP)。在Web服务场景中,Spring...

    MyEclipse+XFire开发Web Services

    ### MyEclipse+XFire开发Web Services #### 实验背景与目标 随着互联网技术的发展,Web Services作为一种重要的软件架构模式,在分布式系统中的应用越来越广泛。它允许不同平台、语言的应用程序通过标准协议(如...

    使用 XFire 与 Spring 开发 Web Service.docx

    【使用 XFire 与 Spring 开发 Web Service】 Web Service是一种基于标准协议的接口,它允许不同应用程序之间进行互操作性,不受平台或编程语言限制。XFire是Apache CXF项目的一部分,是一个轻量级的、高性能的Java ...

    Web-Service学习手册(Xfire).docx

    1.3.3 CXF:CXF是另一个流行的开源Web Service框架,它结合了Xfire和Apache SOAP项目的优点,支持多种Web Service规范,并且可以与Spring框架无缝集成。 1.3.4 主流 Web Service 的比较 Axis适合初学者,因为它的...

    使用Xfire创建Web service和客户端使用的视频

    Xfire是一款曾经流行的开源Java框架,用于构建和消费Web服务。在这个主题中,我们将深入探讨如何使用Xfire创建Web服务以及客户端的实现,同时结合MyEclipse 6.5集成开发环境(IDE)和Tomcat 6.0应用服务器。 1. **...

    MyEclipse[实战开发讲解入门..XFire.Web.Service.入门

    《MyEclipse实战开发讲解入门XFire.Web.Service.入门》 在IT行业中,MyEclipse作为一款强大的Java集成开发环境,被广泛应用于企业级应用的开发。本资源包旨在为初学者提供一个全面的MyEclipse实战开发指南,特别是...

    web service (xfire)

    XFire是Java平台上的一款开源Web服务框架,它允许开发者轻松地创建和消费Web服务。在本项目中,我们将深入探讨XFire如何帮助实现Web服务以及相关知识点。 首先,让我们了解Web服务的基本概念。Web服务使用统一的...

    Java Web Service xFire Demo项目,带所有的包,完美运行

    本项目“Java Web Service xFire Demo”是一个完整的示例,用于演示如何在Java环境中使用xFire实现Web服务。 首先,让我们深入了解xFire的核心概念。xFire基于Apache CXF项目,它提供了强大的XML绑定、协议处理和WS...

Global site tag (gtag.js) - Google Analytics