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

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

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

    隨筆 - 312, 文章 - 14, 評(píng)論 - 1393, 引用 - 0
    數(shù)據(jù)加載中……

    WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理

    本文為原創(chuàng),如需轉(zhuǎn)載,請注明作者和出處,謝謝!

    上一篇:WebService大講堂之Axis2(5):會(huì)話(Session)管理

    《WebService大講堂之Axis2(5):會(huì)話(Session)管理》一文中介紹了如何使用Axis2來管理同一個(gè)服務(wù)的會(huì)話,但對于一個(gè)復(fù)雜的系統(tǒng),不可能只有一個(gè)WebService服務(wù),例如,至少會(huì)有一個(gè)管理用戶的WebService(用戶登錄和注冊)以及處理業(yè)務(wù)的WebService。象這種情況,就必須在多個(gè)WebService服務(wù)之間共享會(huì)話狀態(tài),也稱為跨服務(wù)會(huì)話(Session)管理。實(shí)現(xiàn)跨服務(wù)會(huì)話管理與實(shí)現(xiàn)同一個(gè)服務(wù)的會(huì)話管理的步驟類似,但仍然有一些差別,實(shí)現(xiàn)跨服務(wù)會(huì)話管理的步驟如下:

    實(shí)現(xiàn)跨服務(wù)的Session管理需要如下三步:

    1. 使用MessageContextServiceGroupContext獲得與設(shè)置key-value對。

    2. 為要進(jìn)行Session管理的WebService類所對應(yīng)的<service>元素添加一個(gè)scope屬性,并將該屬性值設(shè)為application

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

    從上面的步驟可以看出,實(shí)現(xiàn)跨服務(wù)會(huì)話管理與實(shí)現(xiàn)同一個(gè)服務(wù)的會(huì)話管理在前兩步上存在著差異,而第3步是完全一樣的。下面是一個(gè)跨服務(wù)的會(huì)話管理的實(shí)例。在這個(gè)例子中有兩個(gè)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步:設(shè)置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 "找到的數(shù)據(jù)<" + name + ">";
            
    else
                
    return "用戶未登錄";
        }
    }

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

    <serviceGroup>
        
    <!--  第2步:添加scope屬性,并設(shè)置屬性值為application -->
        
    <service name="loginService" scope="application">
            
    <description>
                登錄服務(wù)
            
    </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屬性,并設(shè)置屬性值為application -->
        
    <service name="searchService" scope="application">
            
    <description>
                搜索服務(wù)
            
    </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):會(huì)話(Session)管理》一文中介紹的方法類似。

    下面是使用兩個(gè)stub類的對象實(shí)例訪問上面實(shí)現(xiàn)的兩個(gè)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); 
    }

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

    成功登錄

    找到的數(shù)據(jù)
    <abc>

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

        實(shí)際上,Axis2的會(huì)話管理也是通過Cookie實(shí)現(xiàn)的,與Web應(yīng)用中的Session管理類似。如果讀者使用C#訪問支持會(huì)話(在同一個(gè)服務(wù)中的會(huì)話管理)的WebService,需要指定一個(gè)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);
    }

    如果是訪問跨服務(wù)的支持會(huì)話的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版本請讀者自行測試)調(diào)用支持會(huì)話的WebService時(shí)有一些差別。經(jīng)筆者測試,使用delphi調(diào)用WebService,將scope屬性值設(shè)為transportsessionapplication都可以實(shí)現(xiàn)跨服務(wù)的會(huì)話管理,這一點(diǎn)和JavaC#不同,JavaC#必須將scope屬性值設(shè)為application才支持跨服務(wù)會(huì)話管理。在delphi中不需要象C#指定一個(gè)CookieContainer或其他類似的對象,而只需要象訪問普通的WebService一樣訪問支持會(huì)話的WebService即可。

    下一篇:
    WebService大講堂之Axis2(7):將Spring的裝配JavaBean發(fā)布成WebService





    Android開發(fā)完全講義(第2版)(本書版權(quán)已輸出到臺(tái)灣)

    http://product.dangdang.com/product.aspx?product_id=22741502



    Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


    新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

    posted on 2009-02-03 23:42 銀河使者 閱讀(13843) 評(píng)論(20)  編輯  收藏 所屬分類: java 原創(chuàng)webservice

    評(píng)論

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    謝謝你的文章,很有用阿
    2009-02-05 13:38 | IT公司面試手冊

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    大哥,牛人啊~~贊
    2009-02-05 23:33 | zuzong

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    文章很有用,想問一個(gè)問題,
    怎樣實(shí)現(xiàn)超時(shí)自動(dòng)終止會(huì)話呢?
    2009-02-07 13:31 | yapituy

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    我每次使用相同的客戶端訪問,以前會(huì)話的內(nèi)容還都存在,怎樣才能使長時(shí)間不用的會(huì)話自動(dòng)斷開
    2009-02-07 13:34 | yapituy

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    這是application級(jí)別的,只有服務(wù)器重啟或重新發(fā)布應(yīng)用程序會(huì)話才會(huì)消失。而其他級(jí)別的我試了一下,并不能跨服務(wù)共享會(huì)話。
    2009-02-07 17:18 | 銀河使者

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    有個(gè)項(xiàng)目,我準(zhǔn)備使用application級(jí)別的會(huì)話管理,但客戶端比較多,如果保存那么多的會(huì)話而不斷開的話,會(huì)不會(huì)對服務(wù)器造成很大的壓力?又沒什么比較好的解決方法實(shí)現(xiàn)會(huì)話的超時(shí)斷開的功能?謝謝!
    2009-02-07 21:16 | yapituy

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    不知你的用戶有多少,10000,還是20000,或更多,一個(gè)會(huì)話只占很小的內(nèi)存。當(dāng)然,除了使用會(huì)話解決你的問題外,還有另外一個(gè)方法可以達(dá)到同樣的效果。使用會(huì)話的目的是為了進(jìn)行權(quán)限驗(yàn)證,你可以為每一個(gè)web service方法都加上一個(gè)用戶名和密碼,可以將這些放到類中進(jìn)行傳遞,這樣就不需要會(huì)話了,每次調(diào)用方法程序都從數(shù)據(jù)庫中驗(yàn)證,你也可以定義一個(gè)靜態(tài)的Map對象在服務(wù)端來保存經(jīng)常登錄的用戶名和密碼,這樣當(dāng)這些用戶調(diào)用該方法時(shí)就不用再到數(shù)據(jù)庫中去驗(yàn)證了。如博客園和blogjava所使用的msn writer寫blog,就是使用的MetaWebBlog API,這個(gè)API雖然不是Web Service(只是一個(gè)遠(yuǎn)程方法調(diào)用),但使用的就是我說的第二種方法,每一方法都有一個(gè)用戶名和密碼。你看看這些方法就知道了:http://www.cnblogs.com/nokiaguy/services/metaweblog.aspx
    2009-02-07 21:34 | 銀河使者

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    另外會(huì)話是可以持久化的,但不知axis2是如何處理的
    2009-02-07 21:35 | 銀河使者

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    能否在登錄的時(shí)候在會(huì)話中記錄登錄時(shí)間,然后每次調(diào)用方法前,取當(dāng)前時(shí)間進(jìn)行判斷,如果時(shí)間間隔大于你的設(shè)定值,無法繼續(xù)操作,需要重新登錄?
    2009-02-09 16:44 | jiangminjie

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    @jiangminjie
    也可以,這種方法
    2009-02-09 16:51 | 銀河使者

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    呵呵,修改了一下ConfigurationContext類,在處理application會(huì)話時(shí),增加了一個(gè)處理超時(shí)的方法。
    2009-02-10 11:06 | yapituy

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    還得請教問題,關(guān)于handler中拋出AxisFault異常的。
    在handler(使用java)中判斷用戶是否登陸,如果未登錄拋出一個(gè)AxisFault異常。客戶端(使用c#)無法捕獲此異常,捕捉到的異常是InvalidOperationException,但如果在service中拋出AxisFault,客戶端可以捕獲SoapException。怎樣處理客戶端才能捕獲到handler中的SoapException?謝謝 !
    2009-02-10 11:27 | yapituy

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    @yapituy
    這個(gè)我也試了,但客戶端也是未補(bǔ)獲AxisFault異常,我用java、c#和delphi試的客戶端,都未補(bǔ)獲AxisFault異常,不知axis2內(nèi)部是如何處理的,也許是有bug,也許是服務(wù)端程序的設(shè)置問題,最終還沒解決,還是就是超時(shí)的問題,可能是axis2本身的問題。
    2009-02-10 11:46 | 銀河使者

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    我問題中說的可能有點(diǎn)亂,在服務(wù)端拋出AxisFault,c#客戶端捕捉到SoapException異常應(yīng)該是正確的。上午說的問題應(yīng)該是handler配置的有問題,只配InFlow就可以捕捉到SoapException了,而我把OutFlow、InFaultFlow、OutFaultFlow也都給配置上了。
    2009-02-10 14:36 | yapituy

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    這路有一個(gè)問題,如果我的用戶名密碼是存在數(shù)據(jù)庫里面的,一旦我對一個(gè)用戶修改密碼或者干脆就刪除掉這個(gè)用戶,那么這樣就必須重啟服務(wù)器才能在驗(yàn)證這部分生效;所以目前這個(gè)實(shí)現(xiàn)辦法還是不能夠接受的,必須能夠讓session內(nèi)的東西自動(dòng)超時(shí)才行。
    既然scope 為應(yīng)用級(jí)別的,可以想辦法用另外一個(gè)線程去維護(hù)用戶信息的超時(shí)狀態(tài)
    2009-02-17 12:10 | Alexwan

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    @Alexwan
    如果用戶修改密碼,可以在修改密碼后將session里的相關(guān)內(nèi)容刪除,這樣客戶端必須要重新登錄才能繼續(xù)使用了。
    2009-02-17 12:19 | 銀河使者

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理[未登錄]  回復(fù)  更多評(píng)論   

    @銀河使者
    我也想問問怎么把session里的相關(guān)內(nèi)容刪除?
    最好能徹底將這個(gè)session刪除。
    2009-09-04 15:41 | todd

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    我用Java實(shí)現(xiàn)的,沒想到將scope設(shè)置成transportsession和application都能夠跨服務(wù)訪問,暈死了,還有,我沒有實(shí)現(xiàn)博主說的第三步,實(shí)驗(yàn)了N次了,哎,不曉得這個(gè)原理到底是怎么回事了
    2010-01-05 12:05 | Mr.Blue

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    樓主你好 我在scope中設(shè)置了application但是訪問結(jié)果還是跟設(shè)置了transportsession一樣 不能跨服務(wù)會(huì)話 請問這是為什么
    <serviceGroup>

    <service name="ManageSession" scope="application">
    <description>
    This is my first webservice which use session.
    </description>
    <parameter name="ServiceClass">com.sha0k.webservice.session.LoginService</parameter>
    <operation name="login">
    <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </operation>
    <operation name="getLoginMsg">
    <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </operation>
    </service>

    <service name="SearchSession" scope="application">
    <description>
    This is my first webservice which use application session.
    </description>
    <parameter name="ServiceClass">com.sha0k.webservice.session.SearchService</parameter>
    <operation name="findByName">
    <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </operation>
    </service>

    </serviceGroup>
    2011-11-21 23:45 | sha0kun

    # re: WebService大講堂之Axis2(6):跨服務(wù)會(huì)話(Session)管理  回復(fù)  更多評(píng)論   

    我的客戶端 session管理 是開啟的 RPCServiceClient serviceClient = new RPCServiceClient();
    Options options = serviceClient.getOptions();
    options.setManageSession(true);
    2011-11-21 23:46 | sha0kun
    主站蜘蛛池模板: 亚洲精品国产高清嫩草影院| 国产乱子伦精品免费无码专区| 18禁止看的免费污网站| 免费精品国产自产拍在| 国产jizzjizz免费视频| 亚洲综合无码精品一区二区三区| 亚洲AV日韩AV天堂久久| 亚洲依依成人精品| 老司机精品视频免费| 成人免费一区二区三区| 永久黄色免费网站| 永久中文字幕免费视频网站| 久久精品国产亚洲Aⅴ香蕉 | 久久亚洲欧洲国产综合| 亚洲国产高清人在线| 亚洲色精品VR一区区三区| 无码免费又爽又高潮喷水的视频| 国产成人免费ā片在线观看老同学 | 又黄又爽无遮挡免费视频| 国产AV无码专区亚洲AVJULIA| 亚洲中文字幕久在线| 特级无码毛片免费视频| 无码av免费一区二区三区试看| 18禁超污无遮挡无码免费网站国产| 无码国产亚洲日韩国精品视频一区二区三区| 久久精品国产亚洲麻豆| 在线亚洲午夜片AV大片| 皇色在线免费视频| 24小时日本在线www免费的| 伊伊人成亚洲综合人网7777| 亚洲人成在线播放| 国产成人无码免费网站| 99精品国产免费久久久久久下载| 2048亚洲精品国产| 99热亚洲色精品国产88| 永久在线观看免费视频| 国产美女无遮挡免费网站| 1区1区3区4区产品亚洲 | 亚洲人成黄网在线观看| 国产精品免费久久| 德国女人一级毛片免费 |