webservice 中管理sessions

 

webservice 中管理sessions

 

    在Web   service中通常采用两种公认技术来管理session,一种是借助HTTP和HTTP   cookies,另一种是用SOAP   headers。Axis能帮你实现这两种技术。

 

   在Web   service中没有一种管理session的标准方法,只有两种公认的技术,一种是依靠HTTP和HTTP   cookies,另一种,或许也是最重要的一种方法,就是用SOAP   headers。Axis能帮助开发人员实现这两种技术。  

 在Axis中缺省使用的是HTTP   managed   sessions。在一个服务器中这么做是十分容易的,因为大多数对Axis   Web   service的管理是通过org.apache.axis.MessageContext的一个实例来完成的。在一个Axis   Web   service中你可以通过调用MessageContext类中的静态方法来得到MessageContext的一个实例:

public   class   SessionService  
  {  
        public   String   echo(String   in)  
        {  
              MessageContext   mc   =    
                    MessageContext.getCurrentContext();  
   
      }

}
    
  MessageContext中有一个名为setMaintainSession的方法,调用它便可激活session。但在编写(Axis   1.1   RC2)时,session对象只有在被访问时才能激活,如下列代码所示:

public   class   SessionService  
  {  
        public   String   echo(String   in)  
        {  
              MessageContext   mc   =   MessageContext.  
                    getCurrentContext();  
              Session   session   =   mc.getSession();  
              String   name   =   (String)session.get("name");  
              return   in;  
        }  
  }   
    

  这样会导致Axis架构生成一个set-cookie   header:Set-Cookie:    
  JSESSIONID=49EBBB19A1B2F8D10EE075F6F14CB8C9;    
  Path=/axissessions   
    

  客户端需要在Cookie   header中返回这个Cookie来保持该session。为了使axis运行状态下的客户端能够实现这一点,就必须调用org.apache.axis.client.Service接口的setMaintainSession方法。该接口是由WSDL2Java生成工具所生成的Locator类实现的。调用该方法之后,Axis架构会自动将该cookie返回到服务器中:  

public   static   void   main(String[]   args)   
  {  
              UseSessionsServiceLocator   locator   =   new    
                    UseSessionsServiceLocator();  
              locator.setMaintainSession(true);  

}
    
  header看起来就像这样:   Cookie:    
  JSESSIONID=49EBBB19A1B2F8D10EE075F6F14CB8C9  

 

 

通过HTTP传输cookie是没有问题的,但如果客户端或服务器不通过HTTP,或使用的是通过多个Web   services传入调用的multihop   service,那么这种方法就不那么有效了。一种更好的方法是用SOAP   headers来加载session   id。    
   
  Axis架构支持多个Handlers。通过在一个Web   service请求过程中调用调栈(call   stack),Handlers能够被放置到很多地方,它可以和传输过程结合起来,或者和一个Web   service一起使用。Handlers可以被插入其中来处理Web   service请求中的请求和/或响应语句。    
Axis带有一个名为org.apache.axis.handlers.SimpleSessionHandler的handler,它用于提供基于session管理的SOAP   header。要使用这个简单的带有Web   service的session   handler,你必须告知Axis架构将该handler添加到handler链中。你可以通过将该handler信息添加到server-config.wsdd来实现这一点;一个简单的处理方法是定义一个包含额外配置Web   service所需的WSDD文件,然后用Axis部署工具来部署这个配置文件。  
   
  这个WSDD文件看起来就像这样:

<deployment   xmlns=  
              "http://xml.apache.org/axis/wsdd/"  
        xmlns:java=  
              "http://xml.apache.org/axis/wsdd/  
                    providers/java">  
   
        <handler   name="session"    
  type="java:org.apache.axis.handlers.  
              SimpleSessionHandler"/>  
   
        <service   name="Sessions"   provider=  
                    "java:RPC"   style="wrapped">  
              <namespace>urn:kevinj:Sessions</namespace>  
              <requestFlow>  
                          <handler   type="session"/>  
              </requestFlow>  
              <responseFlow>  
                          <handler   type="session"/>  
              </responseFlow>  
              <parameter   name="className"   value=  
                          "kevinj.UseSessions"/>  
              <parameter   name="allowedMethods"   value="*"/>  
        </service>  
   
  </deployment>  

 该handler是和service分开定义并引用的,虽然你可以在service内部定义它。注意这个handler是同时为了请求和响应而定义的;这就确保了这些headers能够在请求中被读取并添加到响应中去。你可以用这个管理工具来部署它:

java     -cp   [classpath   to   axis   bits   here]   /    
                    org.apache.axis.client.AdminClient   /  
                    -lhttp://localhost/myservice/AxisServlet  
                    deploy.wsdd  
现在服务器就可以运行了,在使用该handler时服务器无需处理任何事情;而headers能够自动被添加进去,就像这样:<soapenv:Header>  
        <ns1:sessionID   soapenv:actor=""    
                                                  soapenv:mustUnderstand="0"    
                                                        xsi:type="xsd:long"    
                                                  xmlns:ns1=  
                                                        "http://xml.apache.org/axis/  
                                                        session">  
                                -1919645576528915916  
        </ns1:sessionID>  
  </soapenv:Header>  
要使用这个header,Web   service客户端必须能够读取它并了解其语法;而Axis客户端可以解决这个问题。  
   
  要创建一个使用这个简单session的Axis客户端,你需要配置Axis客户端框架来使用该handler。过程同服务器端很相似,但不是部署到服务器,而是在本地创建config文件。你可以通过运行org.apache.axis.utils.Admin来实现这一点。运行以下代码:org.apache.axis.utils.Admin   client   deploy.wsdd  

这样就创建了一个client-config.wsdd文件,它同样也包含handler代码。

<?xml   version="1.0"   encoding="UTF-8"?>  
  <deployment   xmlns=  
        "http://xml.apache.org/axis/wsdd/"    
  xmlns:java=       "http://xml.apache.org/axis/  
        wsdd/providers/java">  
              <globalConfiguration>  
                          <parameter   name="adminPassword"    
                                value="admin"/>  
                          <parameter   name="attachments.implementation"    
                                value=  
                                      "org.apache.axis.attachments.  
                                      AttachmentsImpl"/>  
                          <parameter   name=  
                                "sendMultiRefs"   value="true"/>  
                          <parameter   name="sendXsiTypes"   value=  
                                "true"/>  
                          <parameter   name=  
                                "sendXMLDeclaration"   value="true"/>  
                          <parameter   name="axis.sendMinimizedElements"    
                                value="true"/>  
                          <requestFlow>  
                                      <handler   type=  
                                      "java:org.apache.axis.handlers.  
                                      SimpleSessionHandler"/>  
                          </requestFlow>  
                          <responseFlow>  
                                      <handler   type=  
                                            "java:org.apache.axis.handlers.  
                                            SimpleSessionHandler"/>  
                          </responseFlow>  
              </globalConfiguration>  
              <handler   name="session"   type=  
                    "java:org.apache.axis.handlers.  
                          SimpleSessionHandler"/>  
              <service   name="Sessions"   provider=  
                    "java:RPC"   style="wrapped"   use="literal">  
                          <requestFlow>  
                                      <handler   type="session"/>  
                          </requestFlow>  
                          <responseFlow>  
                                      <handler   type="session"/>  
                          </responseFlow>  
                          <parameter   name="allowedMethods"   value="*"/>  
                          <parameter   name="className"   value=  
                                "kevinj.UseSessions"/>  
                          <namespace>urn:kevinj:Sessions</namespace>  
              </service>  
              <transport   name="java"   pivot=  
                    "java:org.apache.axis.transport.  
                    java.JavaSender"/>  
              <transport   name="http"   pivot=  
                    "java:org.apache.axis.transport.  
                          http.HTTPSender"/>  
              <transport   name="local"   pivot=  
                    "java:org.apache.axis.transport.  
                    local.LocalSender"/>  
  </deployment>  
为了使客户端能够利用这个handler,你必须将client-config.wsdd文件添加到客户端的classpath中。然后由Axis框架代表客户端来读取并响应这些headers。同样,客户端代码无需处理任何事情便可以使用它了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值