WebService之Axis2快速入門(6): 跨服務會話(Session)管理

在《WebService之Axis2快速入門(5): 管理會話(Session)》一文中介紹瞭如何使用Axis2來管理同一個服務的會話,但對於一個複雜的系統,不可能只有一個WebService服務,例如,至少會有一個管理用戶的WebService(用戶登陸和註冊)以及處理業務的WebService。象這種狀況,就必須在多個WebService服務之間共享會話狀態,也稱爲跨服務會話(Session)管理。實現跨服務會話管理與實現同一個服務的會話管理的步驟相似,但仍然有一些差異,實現跨服務會話管理的步驟以下: java

實現跨服務的Session管理須要以下三步: apache

1. 使用MessageContext和ServiceGroupContext得到與設置key-value對。 session

2. 爲要進行Session管理的WebService類所對應的<service>元素添加一個scope屬性,並將該屬性值設爲application。 app

3. 在客戶端使用setManageSession(true)打開Session管理功能。 spa

從上面的步驟能夠看出,實現跨服務會話管理與實現同一個服務的會話管理在前兩步上存在着差別,而第3步是徹底同樣的。下面是一個跨服務的會話管理的實例。在這個例子中有兩個WebService類:LoginService和SearchService,代碼以下:

LoginService.java .net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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文件中的配置代碼以下: 對象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<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)》一文中介紹的方法相似。 ip

下面是使用兩個stub類的對象實例訪問上面實現的兩個WebService的客戶端代碼: ci

1
2
3
4
5
6
7
8
9
10
11
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);
}

在執行上面的代碼後,將輸出以下的信息:

1
2
成功登陸
找到的數據<abc>

讀者能夠將scope屬性值改爲transportsession,看看會輸出什麼!

實際上,Axis2的會話管理也是經過Cookie實現的,與Web應用中的Session管理相似。若是讀者使用C#訪問支持會話(在同一個服務中的會話管理)的WebService,須要指定一個CookieContainer對象,代碼以下:

1
2
3
4
5
6
7
8
service.loginService ls = new service.loginService();
System.Net.CookieContainer cc = new System.Net.CookieContainer();
ls.CookieContainer = cc;
bool r, rs;
ls.login("bill", "1234", out  @r , out rs);
if (r) {
        MessageBox.Show(ls.getLoginMsg().@return);
}

若是是訪問跨服務的支持會話的WebService,則不須要指定CookieContainer對象,代碼以下:

1
2
3
4
5
6
7
service.loginService ls = new service.loginService();
bool r, rs;
ls.login("bill", "1234", out  @r , out rs);
if (r){
    service1.searchService ss = new service1.searchService();
    MessageBox.Show(ss.findByName("abc"));
}
相關文章
相關標籤/搜索