Uploaded image for project: 'Axis'
  1. Axis
  2. AXIS-986

Can't share sessions between different services ??

Attach filesAttach ScreenshotVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Resolution: Won't Fix
    • 1.1rc2
    • None
    • Basic Architecture
    • None
    • Operating System: Windows NT/2K
      Platform: PC
    • 22125

    Description

      Hi everybody,

      I've been trying lately to share a session between two distinct axis web
      services. I am using client generated classes (with WSDL2Java) and the default
      hhtp cookie based session management.

      Here is how I proceeded :

      1) I invoke the first XXX service :

      XXXService firstService = new XXXServiceLocator();
      XXX firstServiceRet = firstService.getXXX(new java.net.URL(...));
      ((XXXSoapBindingStub)firstServiceRet).setMaintainSession(true);
      firstServiceRet.XXX(...) //invoke the service

      Note the use of the setMaintainSession method : this sets the Stub and the
      MessageContext maintainSession property to true.
      When getting back the response from the axis server, if this property is set to
      true, axis retrieves the cookie header from the response and stores it in the
      MessageContext :

      msgContext.setProperty(HTTPConstants.HEADER_COOKIE, cookie);

      (see org.apache.axis.transport.http.HTTPSender for details ...)

      2) Then here is how I retrieve the cookie after the call to the XXX Service :

      Call XXXCall = ((org.apache.axis.client.axis.Service)firstService).getCall();
      org.apache.axis.MessageContext msgContext = XXXCall.getMessageContext();
      String cookie = msgContext.getStrProp(HTTPConstants.HEADER_COOKIE);

      This works fine ... checked it with TCPMon ... get the real cookie ...

      3) I invoke the second YYY service:

      YYYService secondService = new YYYServiceLocator();
      YYY secondServiceRet = secondService.getYYY(new java.net.URL(...));
      ((YYYSoapBindingStub)firstServiceRet).setMaintainSession(true);

      Here again, if maintainSession is set to true, the writeToSocket method will
      retrieve the cookie from the messageContext (String cookie =
      msgContext.getStrProp(HTTPConstants.HEADER_COOKIE)) and put it into the http
      header request.

      My idea here was thus to put the cookie retrieved from the first XXXCall into
      the messageContext of the second YYY Call object before invoking it.
      The problem is that when invoking the call: YYYCall.invoke(...) (this is done
      in the YYYSoapBindingStub class), the invoke metod calls the reset method of
      the messageContext and the cookie information is lost !! (MessageContext.bag is
      cleared) (see org.apache.axis.client.Call).

      Is there a way of passing the cookie to the second Call without modifying axis
      code ??
      If not, it wouldn't require much code modifications to allow setting a cookie
      in a call and thus allow Session Sharing.

      I think session sharing between different services is an important feature.
      This is an important issue !!!
      Any help would be greatly appreciated !!! Thanks ...

      PS: by the way, this method of passing the cookie from service to service works
      perfectly with a .NET client !

      Attachments

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            Unassigned Unassigned
            tbigourdan@amadeus.net Tristan B.
            Votes:
            1 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Slack

                Issue deployment