kapok

垃圾桶,嘿嘿,我藏的这么深你们还能找到啊,真牛!

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  455 随笔 :: 0 文章 :: 76 评论 :: 0 Trackbacks
http://www.ftponline.com/china/XmlFile.aspx?ID=312
在Web service中通常采用两种公认技术来管理session,一种是借助HTTP和HTTP cookies,另一种是用SOAP headers。Axis能帮你实现这两种技术。
by Kevin Jones

在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。同样,客户端代码无需处理任何事情便可以使用它了。


关于作者:
Kevin Jones是一名有着15年开发经验的开发人员。最近四年来,他一直从事Java编程方面的研究和教学,最近, 他主要研究HTTP和XML。Kevin住在U.K.,他为Developmentor工作,这是一家以United States 和Europe为基地,主要做Java和Microsoft平台的技术培训的公司。Kevin的联系方式是:kevinj@develop.com
posted on 2005-08-14 08:51 笨笨 阅读(876) 评论(1)  编辑  收藏 所属分类: J2EEALLWeb Services

评论

# re: 在Web Services中管理Sessions 2006-10-20 16:11 我也叫笨笨
刚毕业,从事java开发,然后想找一些资源,同时想找一些同行业中的强人,刺激一下我,让我好好的在java的路上走的越来越远  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: