<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 禮物 閱讀(322) 評論(0)  編輯  收藏 所屬分類: Axis
    主站蜘蛛池模板: 久久精品国产亚洲AV未满十八| 日批日出水久久亚洲精品tv| 久久久久国产精品免费网站| 黄色视屏在线免费播放| 一区二区三区AV高清免费波多| 精品国产亚洲AV麻豆 | 国产人妖ts在线观看免费视频| 亚洲中文无码永久免费| 真人做人试看60分钟免费视频| 亚洲免费观看网站| 日韩国产免费一区二区三区| 国产情侣激情在线视频免费看| 日韩国产免费一区二区三区| 好爽又高潮了毛片免费下载| 无码国模国产在线观看免费| 国产精品二区三区免费播放心| 国产一级淫片a免费播放口之| 国产又黄又爽又猛的免费视频播放 | 亚洲国产精品综合久久久| 亚洲国产日产无码精品| 亚洲综合无码无在线观看| 亚洲AV日韩AV无码污污网站| 免费观看四虎精品成人| 中文字幕免费观看全部电影| 久久精品免费电影| 黄网站色在线视频免费观看| 大学生a级毛片免费观看 | 久久久高清日本道免费观看| 91精品免费观看| 成人av免费电影| 亚洲国产精品激情在线观看| 国产亚洲av片在线观看16女人| 亚洲综合激情视频| 亚洲国产成人无码AV在线| 一区二区免费电影| 91香焦国产线观看看免费| 成年人性生活免费视频| 亚洲精品视频在线看| 亚洲精品国产成人99久久| 国产亚洲精aa在线看| 一本岛v免费不卡一二三区|