新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     >>计算机科学论坛<<     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论Java, J2SE, J2ME, J2EE, 以及Eclipse, NetBeans, JBuilder等Java开发环境,还有JSP, JavaServlet, JavaBean, EJB以及struts, hibernate, spring, webwork2, Java 3D, JOGL等相关技术。
    [返回] 计算机科学论坛计算机技术与应用『 Java/Eclipse 』 → 在Web Services中管理Sessions(转贴) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6628 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 在Web Services中管理Sessions(转贴) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     mfc42d 帅哥哟,离线,有人找我吗?
      
      
      等级:大三暑假(ITELS考了6.5分!)(版主)
      文章:65
      积分:882
      门派:XML.ORG.CN
      注册:2004/6/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给mfc42d发送一个短消息 把mfc42d加入好友 查看mfc42d的个人资料 搜索mfc42d在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看mfc42d的博客楼主
    发贴心情 在Web Services中管理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)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/7/13 19:53:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Java/Eclipse 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/27 20:25:35

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    3,765.625ms