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

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

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

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 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-09-23 14:40 禮物 閱讀(316) 評論(0)  編輯  收藏 所屬分類: Axis
    主站蜘蛛池模板: 亚洲无线一二三四区手机| 中文字幕在线成人免费看| 久久国产高潮流白浆免费观看 | 免费国产人做人视频在线观看| 成年网站免费入口在线观看| 久久亚洲国产午夜精品理论片| 精品国产免费人成网站| 亚洲最大的视频网站| 日韩精品内射视频免费观看 | 深夜A级毛片视频免费| 免费va人成视频网站全| 日本在线免费观看| 亚洲综合一区二区精品久久| 久久午夜夜伦鲁鲁片免费无码| 中文字幕亚洲综合小综合在线 | a毛片免费播放全部完整| 亚洲一区二区三区免费观看| 国产免费AV片在线播放唯爱网 | 你懂得的在线观看免费视频| 2019亚洲午夜无码天堂| 国产成人亚洲精品狼色在线| 最近最新中文字幕完整版免费高清| A国产一区二区免费入口| 亚洲乱亚洲乱妇无码| 亚洲国产成人久久综合一| 成人伊人亚洲人综合网站222| 免费看一级一级人妻片 | 一级特黄录像免费播放肥| 亚洲午夜精品久久久久久app| 国产成人免费全部网站| 精品成在人线AV无码免费看| 国产精品极品美女自在线观看免费 | 免费很黄无遮挡的视频毛片| 亚洲精品在线免费观看视频| 国产亚洲人成网站在线观看| 久久aa毛片免费播放嗯啊| 亚洲天堂2016| 亚洲国产成人久久综合一| 久久亚洲2019中文字幕| 在线观看亚洲免费| 成熟女人特级毛片www免费|