<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    CONAN ZONE

    你越掙扎我就越興奮

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      0 Posts :: 282 Stories :: 0 Comments :: 0 Trackbacks

    《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

    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文件中的配置代碼如下:

    <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的客戶端代碼:

    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); 
    }

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

    成功登錄

    找到的數據
    <abc>

    讀者可以將scope屬性值改成transportsession,看看會輸出什么!

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

    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對象,代碼如下:

    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"));
    }

    如果讀者使用delphi(本文使用的是delphi2009,其他的delphi版本請讀者自行測試)調用支持會話的WebService時有一些差別。經筆者測試,使用delphi調用WebService,將scope屬性值設為transportsessionapplication都可以實現跨服務的會話管理,這一點和JavaC#不同,JavaC#必須將scope屬性值設為application才支持跨服務會話管理。在delphi中不需要象C#指定一個CookieContainer或其他類似的對象,而只需要象訪問普通的WebService一樣訪問支持會話的WebService即可。

    posted on 2009-02-06 11:47 CONAN 閱讀(233) 評論(0)  編輯  收藏 所屬分類: Web Service
    主站蜘蛛池模板: 亚洲国产成人精品无码区在线秒播| MM131亚洲国产美女久久| 亚洲人成网站影音先锋播放| 一道本在线免费视频| 亚洲乱码中文字幕手机在线| 一个人看www在线高清免费看| 2022年亚洲午夜一区二区福利| 99久久99久久精品免费观看| 久久精品国产亚洲AV无码偷窥| 日本免费一区二区三区| 亚洲国产精品网站久久| 猫咪社区免费资源在线观看| 亚洲日本成本人观看| 久久精品无码专区免费东京热 | 免费看国产一级特黄aa大片| 福利片免费一区二区三区| 亚洲成人国产精品| 久久99精品免费一区二区| 亚洲av永久无码精品网站 | 亚洲一区二区观看播放| 国产在线观看免费视频播放器| 免费无码国产在线观国内自拍中文字幕 | 亚洲国产综合自在线另类| 成年人视频在线观看免费| 精品国产_亚洲人成在线| 亚洲自偷自偷在线制服| 99re在线这里只有精品免费| 国产精品亚洲精品观看不卡| 国产美女无遮挡免费视频网站| 国产精品极品美女自在线观看免费| 亚洲国产成人高清在线观看| 100000免费啪啪18免进| 免费又黄又爽又猛大片午夜| 久久99国产亚洲高清观看首页| 日韩在线免费视频| av电影在线免费看| 亚洲国产中文在线视频| 一区二区三区亚洲视频| 精品亚洲成a人在线观看| 亚洲永久精品ww47| 日韩免费电影网站|