客户端与服务器使用不同语言做Web Services,并实现会话机制,不知道能有解决方案吗? 能用一种语言就不会请教大家了,我想用java实现服务器,在客户端用delphi做一个控件,用浏览器激活,然后delphi的控件就能和java的web services交互了,但就是不知如何实现会话,我想直接用soap自己解析能做到,但太麻烦,请问有直接用web services或rpc解决的方案吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 开发高手web services专辑(忘记了是哪一期)上有个简单例子delphi客户端,soap控件 如果你觉得soap麻烦,你就用tcp/ip来传输数据不就好了~ 当然可以,跨语言本来就是Web Service的长处,会话功能在http1.1就支持了。 确实,跨语言本来就是Web Service的长处 Delphi中的Httprio控件本身就具有了Session的功能,你可以放心的用。所有Session的属性通过服务端设定即可。 java 写服务端,怎么不也用java写可个客服端控件啊,个人认为比delphi强 因为java的客户端访问ms word不方便 在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。同样,客户端代码无需处理任何事情便可以使用它了。 关于 struts2 自动校验框架的问题 j2ee中weblogic8的问题???? 在hibernate中 inverse="false"是什么意思 Proxool开启连接很慢 应该如何解决?、 XML to PDF 换页问题. hibernate 查询 怎样用Optimizeit发现踪内存泄漏? 求助:JSTL环境出错! 关于在JBOSS下运行CMP的问题 比较一下J2EE/J2ME/J2ME/JDK/JSDK/都是什么呀???? 怎么制作一个用java写一个webservice? 我想做一个网上报名系统!!!求教高手指点!!
delphi客户端,soap控件
--------------------------------------------------------------------------------
在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。同样,客户端代码无需处理任何事情便可以使用它了。