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

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

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

    隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
    數據加載中……

    WebService大講堂之Axis2(5):會話(Session)管理

    本文為原創,如需轉載,請注明作者和出處,謝謝!


    上一篇:WebService大講堂之Axis2(4):二進制文件傳輸

    WebService給人最直觀的感覺就是由一個個方法組成,并在客戶端通過SOAP協議調用這些方法。這些方法可能有返回值,也可能沒有返回值。雖然這樣可以完成一些工具,但這些被調用的方法是孤立的,當一個方法被調用后,在其他的方法中無法獲得這個方法調用后的狀態,也就是說無法保留狀態。

    讀者可以想象,這對于一個完整的應用程序,無法保留狀態,就意味著只依靠WebService很難完成全部的工作。例如,一個完整的應用系統都需要進行登錄,這在Web應用中使用Session來保存用戶登錄狀態,而如果用WebService的方法來進行登錄處理,無法保存登錄狀態是非常令人尷尬的。當然,這也可以通過其他的方法來解決,如在服務端使用static變量來保存用戶狀態,并發送一個id到客戶端,通過在服務端和客戶端傳遞這個id來取得相應的用戶狀態。這非常類似于Web應用中通過SessionCookie來管理用戶狀態。但這就需要由開發人員做很多工作,不過幸好Axis2為我們提供了WebService狀態管理的功能。

    使用Axis2來管理WebService的狀態基本上對于開發人員是透明的。在WebService類需要使用org.apache.axis2.context.MessageContextorg.apache.axis2.context.ServiceContext類來保存與獲得保存在服務端的狀態信息,這有些象使用HttpSession接口的getAttributesetAttribute方法獲得與設置Session域屬性。

    除此之外,還需要修改services.xml文件的內容,為<service>元素加一個scope屬性,該屬性有四個可取的值:Application, SOAPSession, TransportSession, Request,不過要注意一下,雖然Axis2的官方文檔將這四個值的單詞首字母和縮寫字母都寫成了大寫,但經筆者測試,必須全部小寫才有效,也就是這四個值應為:application、soapsessiontransportsessionrequest,其中requestscope屬性的默認值。讀者可以選擇使用transportsessionapplication分別實現同一個WebService類和跨WebService類的會話管理。

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

    綜上所述,實現同一個WebServiceSession管理需要如下三步:

    1. 使用MessageContextServiceContext獲得與設置key-value對。

    2. 為要進行Session管理的WebService類所對應的<service>元素添加一個scope屬性,并將該屬性值設為transportsession

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

    下面是一個在同一個WebService類中管理Session的例子。

    先建立一個WebService類,代碼如下:


    package service;
    import org.apache.axis2.context.ServiceContext;
    import org.apache.axis2.context.MessageContext;
    public class LoginService
    {
        
    public boolean login(String username, String password)
        {
            
    if("bill".equals(username) && "1234".equals(password))
            {
                
    //  第1步:設置key-value對
                MessageContext mc = MessageContext.getCurrentMessageContext();
                ServiceContext sc 
    = mc.getServiceContext();
                sc.setProperty(
    "login""成功登錄");    
                
    return true;
            }
            
    else
            {
                
    return false;
            }
        }
        
    public String getLoginMsg()
        {
            
    //  第1步:獲得key-value對中的value
            MessageContext mc = MessageContext.getCurrentMessageContext();
            ServiceContext sc 
    = mc.getServiceContext();
            
    return (String)sc.getProperty("login");    
        }
    }

    LoginService類中有兩個方法:logingetLoginMsg,如果login方法登錄成功,會將“成功登錄”字符串保存在ServiceContext對象中。如果在login方法返回true后調用getLoginMsg方法,就會返回“成功登錄”。

    下面是LoginService類的配置代碼(services.xml):

    <!--  第2步:添加scope屬性  -->
    <service name="loginService" scope="transportsession">
        
    <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>

    使用如下的命令生成客戶端使用的stub類:

    %AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/loginService?wsdl -p client -s -o stub

    stub\src\client目錄中生成了一個LoginServiceStub.java類,在該類中找到如下的構造句方法:

    public LoginServiceStub(org.apache.axis2.context.ConfigurationContext configurationContext,
            java.lang.String targetEndpoint, 
    boolean useSeparateListener)
            
    throws org.apache.axis2.AxisFault 
    {
         
        _serviceClient.getOptions().setSoapVersionURI(
                                     org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
    }

    在該方法中最后添加如下的代碼:

    //  第3步:打開客戶端的Session管理功能
    _serviceClient.getOptions().setManageSession(true);

    下面的客戶端代碼使用LoginServiceStub對象訪問了剛才建立的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);
    }

    運行上面的代碼后,會輸出“成功登錄”信息。

    下一篇:
    WebService大講堂之Axis2(6):跨服務會話(Session)管理





    Android開發完全講義(第2版)(本書版權已輸出到臺灣)

    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-01-26 00:00 銀河使者 閱讀(18512) 評論(31)  編輯  收藏 所屬分類: java 原創 、webservice

    評論

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    我按照樓主的方法,可是為什么System.out.println(stub.getLoginMsg().local_return);得到的為null?
    2009-04-28 18:16 | Sophie

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    看看services.xml文件設置是否正確
    2009-04-28 19:42 | 銀河使者

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    我就是把你的例子復制粘貼的。
    同時,我看網上其他人的帖子說,要修改axis2.xml,增加<parameter name="manageTransportSession" locked="false">true</parameter>。
    我試了以后還是不好使。我按照您在“WebService大講堂之Axis2(6):跨服務會話(Session)管理”中的講解,跨服務會話管理是好使的。
    2009-04-29 10:49 | Sophie

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    老大,我這邊沒有local_return啊,
    System.out.println(stub.getLoginMsg().local_return);
    只有
    System.out.println(stub.getLoginMsg().get_return());
    那個LoginServiceStub也是我wsdl2java自動生成的,我那個syso能夠成功運行。
    2009-05-18 21:27 | Harold.Zhang

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    @Harold.Zhang
    我的有啊,不知你是怎么生成的,編寫和我的一樣嗎?
    你的get_return可以返回值嗎?
    2009-05-18 22:25 | 銀河使者

    # re: WebService大講堂之Axis2(5):會話(Session)管理[未登錄]  回復  更多評論   

    您好,再請教一下,我按照上面的內容,寫好了webservice代碼、service.xml 然后把它們打包為ws.aar,也放入到了tomcat下,接下來的調用,我沒有按照上面的自動生成的代碼,而是用前面的例子改了一下
    public static void main(String[] args) throws Exception
    {

    RPCServiceClient serviceClient = new RPCServiceClient();
    Options options = serviceClient.getOptions();
    options.setManageSession(true);
    String url=" http://localhost:8080/axis2/services/loginService";
    EndpointReference targetEPR = new EndpointReference(url);
    options.setTo(targetEPR);
    Object[] opAddEntryArgs = new Object[] {"bill","1234"};
    Class[] classes = new Class[] {String.class};
    QName opAddEntry = new QName("http://service", "login");
    System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);

    }
    我這里把login的返回值稍做了修改。
    但是運行這段代碼,報Exception in thread "main" org.apache.axis2.AxisFault: Transport out has not been set異常,在google里搜了半天也沒有好的解釋……
    2009-05-21 14:47 | 菜鳥

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    不使用stub有時很麻煩。我一般很少使用其他方式調用。你的那段代碼就算調試成功,以后用時也會很麻煩,只是調用了一個方法,弄這么一大堆代碼。關于RPC還有有其他方式,只需要了解一下原理就可以。至于真正開發時,一般都用stub。你見用過.net調用webservice用這么多代碼嗎?哈哈
    2009-05-21 14:52 | 銀河使者

    # re: WebService大講堂之Axis2(5):會話(Session)管理[未登錄]  回復  更多評論   

    如果使用stub,我覺得對初學的人比較麻煩的一點是,對于命令生成的代碼,共有2000多行,我們應該修改那一個方法呢?自己的代碼又該放到什么位置合適呢?這個感覺比較疼痛,請指教,因為我也發現如果自己寫代碼調用service是比較麻煩一點。另外對于異常org.apache.axis2.AxisFault: Transport out has not been set,你以前在開發時碰到過嗎?
    2009-05-22 14:08 | 菜鳥

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    stub不是用來修改的,是用來調用了,就將stub當成普通類好了(普通的Java類怎么用,stub類就怎么用)。

    你的異常我沒遇到過。我使用其他方法只是做測試。實際應用還是用stub的。否則會很麻煩。
    2009-05-22 14:20 | 銀河使者

    # re: WebService大講堂之Axis2(5):會話(Session)管理[未登錄]  回復  更多評論   

    終于知道錯誤原因了,String url=" http://localhost:8080/axis2/services/loginService";把http之前的空格去掉就好了,唉,真是沒想到啊。呵呵。繼續學習WebService大講堂之Axis2。
    2009-05-22 14:39 | 菜鳥

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    Exception in thread "main" org.apache.axis2.AxisFault: Exception occurred while trying to invoke service method login
    at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:512)
    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:370)
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:416)
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228)
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163)
    at service.LoginServiceStub.login(LoginServiceStub.java:199)
    at service.Client.main(Client.java:16)


    我按你的步驟來,總是報這個異常,為什么呢?
    2009-08-30 21:05 | 冷風

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    為什么我在setProperty之后發現getProperty出來的中文是亂碼?
    2009-09-24 15:18 | orangehome

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    請問,我按照整個流程下來,"成功登陸"都可以正常輸出,可是這一節的會話管理,重在實現session保存登錄信息的功能.
    為什么當我發布了WS以后,進行過一次的客戶端登錄,按道理已經保留了
    sc.getProperty("login")的登錄信息.

    但是,tomcat沒停,直接運行System.out.println(stub.getMessage().get_return());,打印卻是null,這是什么原因呢?

    所以,我覺得session管理的實現,好像沒有成功.
    2009-09-27 18:05 | zhangx

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    沒動手操作過,只是想說一下個人的理解,不知道對不對?
    加上scope="transportsession",理解就是那個服務是屬于transportsession級別的服務了,也就是說這個變更在transportsession超時前這個實例對象是不會消失的,既然不會消失,就沒必要放到ServiceContext中。

    另外
    2009-10-16 14:25 | china-qd

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    @冷風
    我也遇到了這個問題,百思不得其解,還望高人指點一二
    2009-11-03 10:25 | Mr.Blue

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    您好,我按照你的步驟,再沒有進行第三步的情況下也能得到正確的結果,加上也能得到正確的結果,所以我懷疑是不是第三步可以省略,還是加上第三步才能確保得到正確的結果,沒有第三步可能會得到正確的結果,也可能不會?
    2009-11-03 11:22 | Mr.Blue

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    @zhangx
    個人認為,這位兄弟對同一個WebService的Session管理這里的理解出現了偏差,你說的那個問題我想應該是跨服務會話的管理了。一點愚見
    2009-12-31 18:05 | Mr.Blue

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    我也按照您的代碼操作,輸出結果是null
    2010-06-15 18:38 | nihao

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    是不是因為services.xml里少寫了相應的scope配置?
    2010-06-15 18:39 | nihao

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    在<service>上添加 scope="transportsession" 后就正常了. 確實是services.xml少寫了這句造成的.
    2010-06-15 19:05 | nihao

    # re: WebService大講堂之Axis2(5):會話(Session)管理[未登錄]  回復  更多評論   

    有個問題:
    按照示例寫的WebServices,用Java寫的客戶端調用,能夠成功。但是用C#.net 調用時,調用getLoginMsg獲取的內容為null。
    難道Axis2里面的Session只能被Java寫的客戶端使用??
    2010-09-01 17:34 | jimmy

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    樓主不出來了幫忙了么?
    我和樓上同樣的問題出現了,誰能指導一下?

    另外,我還有二個疑問,我是用的是 scope="application“ :
    第一:我 A 客戶端 login 后 取值,成功了, B客戶端,只做取值,居然把 A客戶端設置的值取出來,為什么啊?
    第二:session 的失效時間,我該從哪里設定管理呢?
    第三:http://blog.csdn.net/tsun7263/archive/2009/10/204705006.aspx 這篇文章翻譯了 Axis2的會話管理 。 ” 管理SOAP會話,客戶端需要在SOAP頭中增加名為“serviceGroupId”的參數。 “ ,我想知道如何給 SOAP頭中增加名為“serviceGroupId”的參數。java代碼該怎么寫?
    2010-11-02 17:46 | deadncut

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    您好,服務端是.net開發,客戶端是JAVA,我自動生成了代碼,但
    運行到:
    MessageContext mc = MessageContext.getCurrentMessageContext();
    ServiceContext sc = mc.getServiceContext();
    這兩句的時候,總是報:
    Exception in thread "main" java.lang.NullPointerException
    很想知道為什么.我的QQ:30962620
    望能答復!
    2011-03-13 00:52 | 半導體

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    我也是按照你上面的介紹的做了一個服務,可是客戶端調用就會出現異常,
    <service name="loginService" scope="transportsession">
    只有這種情況調用不了。這是為什么呢。其它的都可以調用。唯有這種不可以。
    2011-07-05 18:16 | ytwps

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    @Sophie
    我也是啊,我發布后沒找到services.xml文件,自己在META-INF下加了一個services.xml好像不起作用,應該放在哪個目錄?
    2011-09-15 14:43 | hduwengbin

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    我在getLoginMsg方法中加了
    System.out.println((String)sc.getProperty("login"));
    打印出來結果也是null,應該是services.xml沒起作用,我用eclipse插件發布的service 應該去哪個目錄設置這個services.xml?
    2011-09-15 14:50 | hduwengbin

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    LoginService 能夠成功發布 但是System.out.println(stub.getLoginMsg().local_return());中getLoginMsg()方法報錯 一定要加參數才行加了不知道如何解決
    2012-03-27 15:38 | 12

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    下面的代碼我測試過,能正常運行:
    public static void main(String[] args) {
    LoginServiceStub stub = null;
    try {
    stub = new LoginServiceStub();
    } catch (AxisFault e) {
    e.printStackTrace();
    }

    LoginServiceStub.Login login = new LoginServiceStub.Login();
    login.setUsername("bill");
    login.setPassword("1234");
    try {
    if(stub.login(login).get_return()) {
    LoginServiceStub.GetLoginMsg getLoginMsg = new LoginServiceStub.GetLoginMsg();
    System.out.println(stub.getLoginMsg(getLoginMsg).get_return());
    }
    } catch (RemoteException e) {
    e.printStackTrace();
    }
    }

    控制臺輸出是:
    成功登錄
    2012-05-12 10:49 | xiaoqing2305

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    @xiaoqing2305
    用的是axis2-1.6.1
    2012-05-12 11:11 | xiaoqing2305

    # axis2-1.6.2 session  回復  更多評論   

    axis2-1.6.2 :
    if(stub.isLogin(method).get_return()){
    System.out.println(stub.getLoginMsg(new MswsStub.GetLoginMsg()).get_return());
    }
    2012-06-24 17:30 | wen12128

    # re: WebService大講堂之Axis2(5):會話(Session)管理  回復  更多評論   

    我發現最后的代碼調用有一點小問題:現發出來 供大家參考
    LoginServiceStub stub = new LoginServiceStub();
    LoginServiceStub.Login login = new LoginServiceStub.Login();
    login.setArgs0("bill");
    login.setArgs1("1234");

    if(stub.login(login).local_return)
    {
    LoginServiceStub.GetLoginMsg getlm = new GetLoginMsg();
    System.out.println(stub.getLoginMsg(getlm).local_return);
    }
    2012-07-12 10:49 | 風云網絡
    主站蜘蛛池模板: 免费看一级高潮毛片| 一进一出60分钟免费视频| 麻豆国产VA免费精品高清在线| 亚洲一区AV无码少妇电影| 亚洲国产一成久久精品国产成人综合 | 亚洲国产精品专区在线观看| 免费网站观看WWW在线观看| 亚洲xxxxxx| 国产亚洲高清不卡在线观看| 国产成在线观看免费视频| 国产日韩AV免费无码一区二区三区 | 亚洲精品无码你懂的| 情人伊人久久综合亚洲| 德国女人一级毛片免费| 日本免费高清视频| 粉色视频成年免费人15次| 综合自拍亚洲综合图不卡区| 亚洲精品成人久久久| 免费看国产精品3a黄的视频| 国产在线观看xxxx免费| 亚洲AV永久无码精品一福利| 亚洲AV无码欧洲AV无码网站| 国产v片免费播放| 香蕉97超级碰碰碰免费公| 国产午夜无码片免费| 精品久久久久亚洲| 亚洲Av高清一区二区三区| 亚洲国产精品无码久久一区二区| 国产gav成人免费播放视频| 1000部拍拍拍18勿入免费视频软件| caoporm碰最新免费公开视频| 亚洲色成人四虎在线观看 | sihu国产精品永久免费| 亚洲国产成人AV在线播放| 亚洲精品视频在线播放| 久久国产亚洲精品麻豆| 亚洲性在线看高清h片| 四虎永久免费网站免费观看| 国产无人区码卡二卡三卡免费| 久久久精品免费国产四虎| 一个人看的www免费在线视频|