`
jetway
  • 浏览: 485955 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

XFire Webservice

    博客分类:
  • java
阅读更多
 
在SpringSide实现XFire Webservice认证

提交时间: Jul 27, 2006 12:17:27 PM
 

XFire官方网站提供的基于Webservice认证的例子有问题,在新版本的XFire1.1.2中编译不通过,不过这也是小Case,我后来折腾了一下,为SpringSide提供了一个简单的Webservice认证功能。
XFire跟Spring的天然融合,让我们可以少努力10年就能简单地在Spring中使用Webservice的强大魅力,我从AXIS专向XFire有一些冲动,也吃了不少亏,但受REST一族的强力吹捧,感觉还是值得尝试的,因此,在公司的系统中也把Axis彻底换了XFire。

回到SpringSide,我大概介绍一下如何配置一个真正实用的XFire验证服务。
SpringSide中的XFire配置文件放在:
SpringSide-bookstore\src\org\springside\bookstore\plugins\webservice\applicationContext-webservice-server.xml
我们在里面定义各个Webservice,该文件其实对应于XFire官方的XFire-Servlet.xml
看看下面的BookService,这是一个典型的Webservice服务,红色的inHandlers是我挂上去的。它的意思是所有访问BookService的请求都会被先送到authenticationHandler去处理,我们的验证逻辑可以在里面进行。
    <!---->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"></bean>
        <property name="mappings">
            <value></value>/BookService=bookWebService
        </property>
        <property name="inHandlers">
            <ref bean="authenticationHandler"></ref>
        </property>
   

我们接着看看authenticationHandler的代码:
我们在SpringSide中通过header方式向服务器提供验证信息(另外一种更简单的方式是创建一个Login的webservice服务,然后在XFire Session中建立Token信息)。
package org.springside.bookstore.plugins.webservice.authentication;

import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.exchange.InMessage;
import org.codehaus.xfire.fault.XFireFault;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;


/**
* XFire的回调的Handler,在XFire配置文件中配置
* Server端的认证模块,回调处理模块
*
* ClientAuthHandler跟AuthenticationHandler要一起用,或者都不用
*
* @author  david.turing
* @blog  openssl.blogjava.net
*
*/
public class AuthenticationHandler extends AbstractHandler {
    private static final Logger log = Logger.getLogger(AuthenticationHandler.class);
   
    public void invoke(MessageContext context) throws Exception {
       
        log.info("#AuthenticationHandler is invoked");
        InMessage message=context.getInMessage();
       
        final Namespace TOKEN_NS = Namespace.getNamespace("SpringSide","http://service.webservice.plugins.bookstore.springside.org"); 
       
        if(message.getHeader()==null)
        {
            throw new XFireFault("GetRelation Service Should be Authenticated",
                    XFireFault.SENDER);
        }
       
        Element token = message.getHeader().getChild("AuthenticationToken", TOKEN_NS);
        if (token == null)
        {
            throw new XFireFault("Request must include authentication token.",
                                 XFireFault.SENDER);
        }

        String username = token.getChild("Username", TOKEN_NS).getValue();
        String password = token.getChild("Password", TOKEN_NS).getValue();

        System.out.println("username="+username);       
        System.out.println("password="+password);
       
        if(username==null||password==null)
            throw new XFireFault("Supplied Username and Password Please",
                    XFireFault.SENDER);
       
        /**
         * 检查用户名密码是否正确
         */
        PasswordAuthenticationManager pamanager=new PasswordAuthenticationManager();
        if(!pamanager.authenticate(username,password))
            throw new XFireFault("Authentication Fail! Check username/password",
                    XFireFault.SENDER);

       
    }
}
注意,XFireFault异常是往客户端抛的,Webservice Client应该学会catch XFireFault.

服务器端就是这么简单,看看客户端的TestCase
package org.springside.bookstore.plugins.webservice.service;

import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.util.List;

import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.springside.bookstore.commons.domain.Book;
import org.springside.bookstore.plugins.webservice.authentication.ClientAuthHandler;

import junit.framework.TestCase;

public class BookServiceWithAuthenticationTestCase extends TestCase {

    protected void setUp() throws Exception {
        super.setUp();
    }

    protected void tearDown() throws Exception {
        super.tearDown();
    }
   
    public void getBookFromWebservice() throws Exception{
   
          Service serviceModel = new ObjectServiceFactory()
                .create(BookService.class);
        BookService service = null;
       
        try {
            service=(BookService) new XFireProxyFactory().create(
                    serviceModel,
                    "http://localhost:8080/springside/service/BookService");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
       
        Client client = ((XFireProxy) Proxy.getInvocationHandler(service)).getClient();
        //挂上ClientAuthHandler,提供认证
        client.addOutHandler(new ClientAuthHandler());
        List list = service.findBooksByCategory(null);
        assertNotNull(list);
        for(int i=0;i             System.out.println(((Book)list.get(i)).getName());
    }

}

你应该看到上面的client.addOutHandler(new ClientAuthHandler());
没错,它跟服务器端的AuthenticationHandler是一对,一起使用的!
也就是,每个被送往WebService服务的请求都被ClientAuthHandler处理过了。
看看ClientAuthHandler做了些什么:
package org.springside.bookstore.plugins.webservice.authentication;

import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;

/**
* 客户端端的认证模块,回调处理模块
* 每个需要认证的WebService方法都可以挂这个Handler
*
* 仅用于Demo,从解耦和易用性出发,
* 没有跟Acegi结合,你可以任意扩展
* 默认用户名/密码是admin/admin
*
* ClientAuthHandler跟AuthenticationHandler要一起用,或者都不用
*
* @author  david.turing
*
* @blog openssl.blogjava.net
*/   
public class ClientAuthHandler extends AbstractHandler {
        private static final Logger log = Logger.getLogger(ClientAuthHandler.class);
       
        //客户端自己配置用户名密码或者更安全的KeyStore方式
        private String username = "admin";
        private String password = "admin";
       
        public ClientAuthHandler() {
        }
       
        public ClientAuthHandler(String username,String password) {
            this.username = username;
            this.password = password;
        }
       
        public void setUsername(String username) {
            this.username = username;
        }
       
        public void setPassword(String password) {
            this.password = password;
        }
       
        public void invoke(MessageContext context) throws Exception {
                       
            /*******************************************
             * Soap Header方式
             * 从Soap Header中获取用户名密码
             *******************************************/
            final Namespace ns = Namespace.getNamespace("SpringSide","http://service.webservice.plugins.bookstore.springside.org"); 
            Element el = new Element("header",ns);

            Element auth = new Element("AuthenticationToken", ns);
            Element username_el = new Element("Username",ns);
            username_el.addContent(username);
            Element password_el = new Element("Password",ns);
            password_el.addContent(password);
            auth.addContent(username_el);
            auth.addContent(password_el);
            el.addContent(auth);           
            context.getCurrentMessage().setHeader(el);           
            log.info("ClientAuthHandler done!");
        }
    }

不就是往header里面注入username,password!

在SpringSide中,所有的Spring配置文件都被小白分散到各个Module中去了,Wuyu原先是在Plugin中提供Webservice功能,因此,我仍然在Plugin中创建XFire接口。
SpringSide的Spring配置文件放在:
SpringSide-bookstore\webapp\WEB-INF\springmvc-servlet.xml
该文件定义了Plugin的xml:
AuthenticationHandler这个Bean需要先定义在Plugins-servlet.xml中,其它很简单,大家去Try一下就知道了。
分享到:
评论

相关推荐

    xfire webservice 完整实例下载

    XFire Webservice是一个基于Java的开源工具,它简化了创建、部署和消费Web服务的过程。在深入探讨这个完整实例之前,我们首先需要了解Web服务的基本概念。Web服务是一种通过网络进行通信的应用程序接口(API)。它们...

    xfire webservice 上传下载源码

    **XFire Webservice 上传下载源码详解** XFire 是一款强大的Java Web服务框架,它为开发者提供了构建高质量、高性能的Web服务的工具。在"xfire webservice 上传下载源码"这个主题中,我们将深入探讨如何使用XFire来...

    xfire webservice集成最少8个包

    标题中的“xfire webservice集成最少8个包”指的是在使用XFire框架开发Web服务时,所需的最小依赖库数量。XFire是早期流行的Java Web服务实现框架,它允许开发者快速创建、部署和消费Web服务。这里提到的8个包可能...

    spring集成xfire webservice实现

    spring集成xfire webservice实现远程调用 将项目发布后,点击http://localhost:8080/SpringWebServiceTest/services/HelloWS?wsdl即可 其中也有客户端的调用,自己试试吧。

    XFire Webservice 服务器端

    XFire Webservice 服务器端是一个专门用于游戏社区的网络服务接口,它允许开发者与XFire游戏客户端进行交互,实现各种功能,如用户登录、好友系统、游戏统计等。在这个压缩包文件中,"WSA"可能代表Web Service ...

    XFire WebService精简包

    XFire WebService精简包是针对开发者设计的一款轻量级工具集合,主要用于快速搭建和运行XFire WebService项目。在IT行业中,Web服务是一个关键组件,它允许不同系统和应用程序之间进行数据交换和功能调用,实现...

    Xfire Webservice的例子

    Xfire Webservice是一个基于Java平台的服务框架,它允许开发者创建和使用Web服务。这个框架的主要目的是简化Web服务的开发过程,使开发人员可以快速地构建分布式应用程序。在本例中,我们将探讨Xfire Webservice与...

    简单的XFire WebService例子

    【XFire WebService简介】 XFire是一款开源的Java Web服务框架,它允许开发者快速、简单地创建和部署Web服务。XFire是Apache CXF项目的前身,其设计目标是提供一个轻量级、高性能且易于使用的Web服务实现。在这个...

    grails+Xfire webservice

    grails+Xfire webservice

    XFire Webservice 客户端

    **XFire Webservice 客户端详解** XFire Webservice 客户端是一款专为连接XFire游戏平台的网络服务而设计的应用程序。XFire是一个已停运的在线游戏社区,它允许玩家与朋友交流、追踪游戏状态以及分享游戏成就。尽管...

    XFIRE webservice 开发实例

    **XFIRE Webservice 开发实例详解** 在信息技术领域,Webservice是一种基于互联网的、平台无关的交互方式,它允许不同的应用程序之间进行数据交换和功能共享。而XFIRE是一款专为游戏社区设计的软件,它提供了丰富的...

    xfire webservice wsdl 文件中字段名称

    标题“xfire webservice wsdl 文件中字段名称”和描述“xfire webservice wsdl 文件中字段名称变化”暗示了我们在讨论如何在XFire中处理和管理WSDL文件中的字段命名,特别是当这些名称需要更改时的处理方法。...

    Xfire WebService框架搭建指南

    《Xfire WebService框架搭建详解》 Xfire是一款开源的Java WebService框架,它提供了简单且高效的构建和消费Web服务的能力。本指南将详细介绍如何利用Xfire搭建服务器端和客户端,以便于理解并掌握其核心功能。 ##...

    XFire WebService开发DEMO

    【XFire WebService开发DEMO】是一个用于演示如何利用XFire框架来开发Web服务的实例。Web服务是一种基于网络的、平台无关的软件接口,它允许不同系统间的应用程序进行交互和数据交换。XFire,是Java社区早期的一个...

    xfire webservice 集成spring客户端封装例子

    xfire webservice 集成spring客户端封装成到一个类打包到客户端就像调静态方法一样

    Xfire webservice 加密

    Xfire Webservice加密是一种在开发基于Xfire的游戏社区服务时,用于保护通信安全的重要技术。Xfire是一款已停运的在线游戏社交平台,它允许玩家与朋友即时通讯、记录游戏成绩,并与其他玩家互动。尽管Xfire本身不再...

    xfire webservice jar包

    标题中的“xfire webservice jar包”指的是XFire,一个早期流行的Java Web服务(Web Service)框架。在Java开发中,Web服务允许不同系统间的应用程序通过网络进行通信。XFire,现已被Apache CXF所取代,是实现这些...

    xfire WEBSERVICE

    【xfire WEBSERVICE】是面向初学者的一个学习WEBSERVICE技术的基础教程。这个压缩包包含的核心内容可能是一个名为“Xfire”的项目或程序,旨在帮助用户了解并掌握WEBSERVICE的基本概念、工作原理和实际应用。 ...

Global site tag (gtag.js) - Google Analytics