`
wxw850227
  • 浏览: 69327 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Axis2:会话(Session)管理

    博客分类:
  • java
阅读更多
WebService给人最直观的感觉就是由一个个方法组成,并在客户端通过SOAP协议调用这些方法。这些方法可能有返回值,也可能没有返回值。虽然这样可以完成一些工具,但这些被调用的方法是孤立的,当一个方法被调用后,在其他的方法中无法获得这个方法调用后的状态,也就是说无法保留状态。

读者可以想象,这对于一个完整的应用程序,无法保留状态,就意味着只依靠WebService很难完成全部的工作。例如,一个完整的应用系统都需要进行登录,这在Web应用中使用Session来保存用户登录状态,而如果用WebService的方法来进行登录处理,无法保存登录状态是非常令人尴尬的。当然,这也可以通过其他的方法来解决,如在服务端使用static变量来保存用户状态,并发送一个id到客户端,通过在服务端和客户端传递这个id来取得相应的用户状态。这非常类似于Web应用中通过Session和Cookie来管理用户状态。但这就需要由开发人员做很多工作,不过幸好Axis2为我们提供了WebService状态管理的功能。

使用Axis2来管理WebService的状态基本上对于开发人员是透明的。在WebService类需要使用org.apache.axis2.context.MessageContext和org.apache.axis2.context.ServiceContext类来保存与获得保存在服务端的状态信息,这有些象使用HttpSession接口的getAttribute和setAttribute方法获得与设置Session域属性。

除此之外,还需要修改services.xml文件的内容,为<service>元素加一个scope属性,该属性有四个可取的值:Application, SOAPSession, TransportSession, Request,不过要注意一下,虽然Axis2的官方文档将这四个值的单词首字母和缩写字母都写成了大写,但经笔者测试,必须全部小写才有效,也就是这四个值应为:application、soapsession、transportsession、request,其中request为scope属性的默认值。读者可以选择使用transportsession和application分别实现同一个WebService类和跨WebService类的会话管理。

在客户端需要使用setManageSession(true)打开Session管理功能。

综上所述,实现同一个WebService的Session管理需要如下三步:

1. 使用MessageContext和ServiceContext获得与设置key-value对。

2. 为要进行Session管理的WebService类所对应的<service>元素添加一个scope属性,并将该属性值设为transportsession。

3. 在客户端使用setManageSession(true)打开Session管理功能。

下面是一个在同一个WebService类中管理Session的例子。

先建立一个WebService类,代码如下:



package service;
import org.apache.axis2.context.ServiceContext;
import org.apache.axis2.context.MessageContext;
public class LoginService
{
    public boolean login(String username, String password)
    {
        if("bill".equals(username) && "1234".equals(password))
        {
            //  第1步:设置key-value对
            MessageContext mc = MessageContext.getCurrentMessageContext();
            ServiceContext sc = mc.getServiceContext();
            sc.setProperty("login", "成功登录");   
            return true;
        }
        else
        {
            return false;
        }
    }
    public String getLoginMsg()
    {
        //  第1步:获得key-value对中的value
        MessageContext mc = MessageContext.getCurrentMessageContext();
        ServiceContext sc = mc.getServiceContext();
        return (String)sc.getProperty("login");   
    }
}

在LoginService类中有两个方法:login和getLoginMsg,如果login方法登录成功,会将“成功登录”字符串保存在ServiceContext对象中。如果在login方法返回true后调用getLoginMsg方法,就会返回“成功登录”。

下面是LoginService类的配置代码(services.xml):


<!--  第2步:添加scope属性  -->
<service name="loginService" scope="transportsession">
    <description>
        登录服务
        </description>
    <parameter name="ServiceClass">
        service.LoginService
        </parameter>
    <messageReceivers>
        <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
            class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </messageReceivers>
</service>


使用如下的命令生成客户端使用的stub类:


%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/loginService?wsdl -p client -s -o stub

在stub\src\client目录中生成了一个LoginServiceStub.java类,在该类中找到如下的构造句方法:


public LoginServiceStub(org.apache.axis2.context.ConfigurationContext configurationContext,
        java.lang.String targetEndpoint, boolean useSeparateListener)
        throws org.apache.axis2.AxisFault
{
    
    _serviceClient.getOptions().setSoapVersionURI(
                                 org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
}


在该方法中最后添加如下的代码:


//  第3步:打开客户端的Session管理功能
_serviceClient.getOptions().setManageSession(true);
下面的客户端代码使用LoginServiceStub对象访问了刚才建立的WebService:


LoginServiceStub stub = new LoginServiceStub();
LoginServiceStub.Login login = new LoginServiceStub.Login();
login.setUsername("bill");
login.setPassword("1234");
if(stub.login(login).local_return)
{
    System.out.println(stub.getLoginMsg().local_return);
}
分享到:
评论

相关推荐

    WebService大讲堂之Axis2系列教程

    Axis2是目前比较流行的WebService引擎。...本课程站在初学者角度介绍了Axis2的大多数常用的功能,例如,以多种方式编写和发布WebService、JAX-RPC、JAX-WS、复杂类型传输、WebService会话管理、Axis2模块等

    axis2-1.4.1及教程

    5):会话(Session)管理 6):跨服务会话(Session)管理 7):将Spring的装配JavaBean发布成 8):异步调用WebService 9):编写Axis2模块(Module) 10):使用soapmonitor模块监视soap请求与响应消息

    axis2;WebService

    Axis WebService会话Session的管理 Axis用控制台Dos命令发布WebService Axis跨多个WebService管理Session Axis用Spring的JavaBean发布WebService Axis异步调用WebService Axis 的Module模块 Axis使用SoapMonitar监视...

    axis2_WebService_开发指南

    Axis WebService 会话Session 的管理 Axis 用控制台Dos 命令发布WebService Axis 跨多个WebService 管理Session Axis 用Spring 的JavaBean 发布WebService Axis 异步调用WebService Axis 的Module 模块 Axis 使用...

    axis2 教程_个人备用文档

    会话(Session)管理 6. 跨服务会话(Session)管理 7. 将Spring的装配JavaBean发布成WebService 8. 异步调用WebService 9. 编写Axis2模块(Module) 10. 使用soapmonitor模块监视soap请求与响应消息

    Axis2教程 包含描述目录的内容

    会话(Session)管理 6. 跨服务会话(Session)管理 7. 将Spring的装配JavaBean发布成WebService 8. 异步调用WebService 9. 编写Axis2模块(Module) 10. 使用soapmonitor模块监视soap请求与响应消息

    Axis2 WebService 开发指南 技术文档 入门文档

    Axis WebService会话Session的管理 Axis用控制台Dos命令发布WebService Axis跨多个WebService管理Session Axis用Spring的JavaBean发布WebService Axis异步调用WebService Axis 的Module模块 Axis使用...

    axis2_webservice

    AxisWebService会话Session的管理 Axis用控制台Dos命令发布WebService Axis跨多个WebService管理Session Axis用Spring的JavaBean发布WebService Axis异步调用WebService Axis的Module模块 Axis使用SoapMonitar监视...

    AXIS2大讲堂文档

    文档1 pojo实现0配置 文档2 符合数据类型 ...文档5 会话管理 文档6 跨越session管理 文档7 spring的bean发布为webservice 文档8 异步调用webservice 文档9 编写axis模块 文档10 使用moniter监视器

    WebService大讲堂之Axis2

    WebService大讲堂之Axis2(5):会话(Session)管理 .................................................................................... 20 WebService大讲堂之Axis2(6):跨服务会话(Session)管理 ...............

    编程入门_Eclipse教程

    3.1.3. WebService会话Session的管理 24 3.1.4. 用Spring创建的JavaBean发布成WebService 29 3.1.5. 异步调用WebService 32 4. Eclipse中安装 Lomboz 35 4.1. 持久化对象与OID 35 4.1.1. 对持久化对象的要求 35 ...

    JAVA上百实例源码以及开源项目源代码

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    JAVA上百实例源码以及开源项目

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    从Java走向Java+EE+.rar

    21.2 实例——利用AXIS开发一个简单的Web Service 310 21.3 小结 314 第22章 Java EE的安全 315 22.1 利用JAAS进行验证和授权 315 22.2 利用JSSE进行安全传输 317 22.3 小结 317 第23章 Java EE的测试 ...

Global site tag (gtag.js) - Google Analytics