WebService大讲堂之Axis2系列课程之六:跨服务会话(Session)管理

WebService大讲堂之Axis2系列教程之六:跨服务会话(Session)管理

《WebService大讲堂之Axis2(5):会话(Session)管理》一文中介绍了如何使用Axis2来管理同一个服务的会话,但对于一个复杂的系统,不可能只有一个WebService服务,例如,至少会有一个管理用户的WebService(用户登录和注册)以及处理业务的WebService。象这种情况,就必须在多个WebService服务之间共享会话状态,也称为跨服务会话(Session)管理。实现跨服务会话管理与实现同一个服务的会话管理的步骤类似,但仍然有一些差别,实现跨服务会话管理的步骤如下:

实现跨服务的Session管理需要如下三步:

1. 使用MessageContextServiceGroupContext获得与设置key-value对。

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

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

从上面的步骤可以看出,实现跨服务会话管理与实现同一个服务的会话管理在前两步上存在着差异,而第3步是完全一样的。下面是一个跨服务的会话管理的实例。在这个例子中有两个WebService类:LoginServiceSearchService,代码如下:

LoginService.java

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


SearchService.java

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->package service;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceGroupContext;
public class SearchService
{
    
public String findByName(String name)
    {
        
//  第1步:获得key-value对中的value
        MessageContext mc = MessageContext.getCurrentMessageContext();
        ServiceGroupContext sgc 
=  mc.getServiceGroupContext();                
        
if (sgc.getProperty("login"!= null)
            
return "找到的数据<" + name + ">";
        
else
            
return "用户未登录";
    }
}

 

services.xml文件中的配置代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><serviceGroup>
    
<!--  第2步:添加scope属性,并设置属性值为application -->
    
<service name="loginService" scope="application">
        
<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>
    
<!--  第2步:添加scope属性,并设置属性值为application -->
    
<service name="searchService" scope="application">
        
<description>
            搜索服务
        
</description>
        
<parameter name="ServiceClass">
            service.SearchService
        
</parameter>
        
<messageReceivers>
            
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                class
="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
        
</messageReceivers>
    
</service>
</serviceGroup>

 

 

3步与《WebService大讲堂之Axis2(5):会话(Session)管理》一文中介绍的方法类似。

下面是使用两个stub类的对象实例访问上面实现的两个WebService的客户端代码:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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);
    SearchServiceStub searchStub 
= new SearchServiceStub();
    SearchServiceStub.FindByName fbn 
= new SearchServiceStub.FindByName();
    fbn.setName(
"abc");
    System.out.println(searchStub.findByName(fbn).local_return); 
}

 

 

在执行上面的代码后,将输出如下的信息:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->成功登录

找到的数据
<abc>

 

读者可以将scope属性值改成transportsession,看看会输出什么!

    实际上,Axis2的会话管理也是通过Cookie实现的,与Web应用中的Session管理类似。

 

form:

http://www.blogjava.net/nokiaguy/archive/2009/nokiaguy/archive/2009/nokiaguy/archive/2009/02/03/253154.html