你的Web Services是类似于哪一种的?一般的这种Http的么?

解决方案 »

  1.   

    这里面详细介绍了你想要的内容
    http://www-900.ibm.com/developerWorks/cn/webservices/ws-deepaxis/另外欢迎光临 http://www.javayou.com
      

  2.   

    我想了解的是客户端与服务器使用不同语言做Web Services,并实现会话机制,如:服务器用java,客户端用Delphi,不知道能有解决方案吗?
      

  3.   

    那估计要用到J2EE那一套了,J2EE中的会话Bean可以保持状态,但不知道和Delphi的交互好不好弄。
      

  4.   

    在客户端保存一个 Session ID 应该可以
    我正在搞一个关于这方面的工程,用 Servelt 作服务端应该可以
      

  5.   

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

  6.   

    最近也在做axis的web service程序开发,看到你们的贴子觉得的确有必要实现session机制,但是我尝试了一下,按照http://www-900.ibm.com/developerWorks/cn/webservices/ws-deepaxis/提供的资料,就连java的web客户端也只能在同一个页面中调用成功,而在不同的客户端页面或者是在不同的服务端的web service程序中获取的session变量值全都是null。
        还是不知道该如何实现session机制。有没有现实可以用的demo程序,总是感觉这方面的资料方面很是欠缺。
        同时也希望多认识几个有相同需求的做java开发的朋友。我的QQ是2285540594,MSN是[email protected]