对于一个复杂的系统,不可能只有一个WebService服务,例如,至少会有一个管理用户的WebService(用户登录和注册)以及处理业务的WebService。象这种情况,就必须在多个WebService服务之间共享会话状态,也称为跨服务会话(Session)管理。实现跨服务会话管理与实现同一个服务的会话管理的步骤类似,但仍然有一些差别,实现跨服务会话管理的步骤如下:
实现跨服务的Session管理需要如下三步:
1. 使用MessageContext和ServiceGroupContext获得与设置key-value对。
2. 为要进行Session管理的WebService类所对应的<service>元素添加一个scope属性,并将该属性值设为application。
3. 在客户端使用setManageSession(true)打开Session管理功能。
从上面的步骤可以看出,实现跨服务会话管理与实现同一个服务的会话管理在前两步上存在着差异,而第3步是完全一样的。下面是一个跨服务的会话管理的实例。在这个例子中有两个WebService类:
LoginService和SearchService,代码如下:
LoginService.java
package service;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceGroupContext;
public class LoginService
{
public boolean login(String username, String password)
{
if("bill".equals(username) && "1234".equals(password))
{
// 第1步:设置key-value对
MessageContext mc = MessageContext.getCurrentMessageContext();
ServiceGroupContext sgc = mc.getServiceGroupContext();
sgc.setProperty("login", "成功登录");
return true;
}
else
{
return false;
}
}
public String getLoginMsg()
{
// 第1步:获得key-value对中的value
MessageContext mc = MessageContext.getCurrentMessageContext();
ServiceGroupContext sgc = mc.getServiceGroupContext();
return (String)sgc.getProperty("login");
}
}
SearchService.java
package service;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceGroupContext;
public class SearchService
{
public String findByName(String name)
{
// 第1步:获得key-value对中的value
MessageContext mc = MessageContext.getCurrentMessageContext();
ServiceGroupContext sgc = mc.getServiceGroupContext();
if (sgc.getProperty("login") != null)
return "找到的数据<" + name + ">";
else
return "用户未登录";
}
}
LoginService.java
package service;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceGroupContext;
public class LoginService
{
public boolean login(String username, String password)
{
if("bill".equals(username) && "1234".equals(password))
{
// 第1步:设置key-value对
MessageContext mc = MessageContext.getCurrentMessageContext();
ServiceGroupContext sgc = mc.getServiceGroupContext();
sgc.setProperty("login", "成功登录");
return true;
}
else
{
return false;
}
}
public String getLoginMsg()
{
// 第1步:获得key-value对中的value
MessageContext mc = MessageContext.getCurrentMessageContext();
ServiceGroupContext sgc = mc.getServiceGroupContext();
return (String)sgc.getProperty("login");
}
}
SearchService.java
package service;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceGroupContext;
public class SearchService
{
public String findByName(String name)
{
// 第1步:获得key-value对中的value
MessageContext mc = MessageContext.getCurrentMessageContext();
ServiceGroupContext sgc = mc.getServiceGroupContext();
if (sgc.getProperty("login") != null)
return "找到的数据<" + name + ">";
else
return "用户未登录";
}
}
services.xml文件中的配置代码如下:
<serviceGroup>
<!-- 第2步:添加scope属性,并设置属性值为application -->
<service name="loginService" scope="application">
<description>
登录服务
</description>
<parameter name="ServiceClass">
service.LoginService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
</service>
<!-- 第2步:添加scope属性,并设置属性值为application -->
<service name="searchService" scope="application">
<description>
搜索服务
</description>
<parameter name="ServiceClass">
service.SearchService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
</service>
</serviceGroup>
<serviceGroup>
<!-- 第2步:添加scope属性,并设置属性值为application -->
<service name="loginService" scope="application">
<description>
登录服务
</description>
<parameter name="ServiceClass">
service.LoginService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
</service>
<!-- 第2步:添加scope属性,并设置属性值为application -->
<service name="searchService" scope="application">
<description>
搜索服务
</description>
<parameter name="ServiceClass">
service.SearchService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
</service>
</serviceGroup>
下面是使用两个stub类的对象实例访问上面实现的两个WebService的客户端代码:
LoginServiceStub stub = new LoginServiceStub();
LoginServiceStub.Login login = new LoginServiceStub.Login();
login.setUsername("bill");
login.setPassword("1234");
if(stub.login(login).local_return)
{
System.out.println(stub.getLoginMsg().local_return);
SearchServiceStub searchStub = new SearchServiceStub();
SearchServiceStub.FindByName fbn = new SearchServiceStub.FindByName();
fbn.setName("abc");
System.out.println(searchStub.findByName(fbn).local_return);
}
LoginServiceStub stub = new LoginServiceStub();
LoginServiceStub.Login login = new LoginServiceStub.Login();
login.setUsername("bill");
login.setPassword("1234");
if(stub.login(login).local_return)
{
System.out.println(stub.getLoginMsg().local_return);
SearchServiceStub searchStub = new SearchServiceStub();
SearchServiceStub.FindByName fbn = new SearchServiceStub.FindByName();
fbn.setName("abc");
System.out.println(searchStub.findByName(fbn).local_return);
}
在执行上面的代码后,将输出如下的信息:
成功登录
找到的数据<abc>
读者可以将scope属性值改成transportsession,看看会输出什么!
实际上,Axis2的会话管理也是通过Cookie实现的,与Web应用中的Session管理类似。如果读者使用C#访问支持会话(在同一个服务中的会话管理)的WebService,需要指定一个CookieContainer对象,代码如下:
service.loginService ls = new service.loginService();
System.Net.CookieContainer cc = new System.Net.CookieContainer();
ls.CookieContainer = cc;
bool r, rs;
ls.login("bill", "1234", out @r, out rs);
if (r)
{
MessageBox.Show(ls.getLoginMsg().@return);
}
service.loginService ls = new service.loginService();
System.Net.CookieContainer cc = new System.Net.CookieContainer();
ls.CookieContainer = cc;
bool r, rs;
ls.login("bill", "1234", out @r, out rs);
if (r)
{
MessageBox.Show(ls.getLoginMsg().@return);
}
如果是访问跨服务的支持会话的WebService,则不需要指定CookieContainer对象,代码如下:
view plaincopy to clipboardprint?
service.loginService ls = new service.loginService();
bool r, rs;
ls.login("bill", "1234", out @r, out rs);
if (r)
{
service1.searchService ss = new service1.searchService();
MessageBox.Show(ss.findByName("abc"));
}
service.loginService ls = new service.loginService();
bool r, rs;
ls.login("bill", "1234", out @r, out rs);
if (r)
{
service1.searchService ss = new service1.searchService();
MessageBox.Show(ss.findByName("abc"));
}
如果使用delphi(本文使用的是delphi2009,其他的delphi版本请读者自行测试)调用支持会话的WebService时有一些差别。经笔者测试,使用delphi调用WebService,将scope属性值设为transportsession和application都可以实现跨服务的会话管理,这一点和Java与C#不同,Java和C#必须将scope属性值设为application才支持跨服务会话管理。在delphi中不需要象C#指定一个CookieContainer或其他类似的对象,而只需要象访问普通的WebService一样访问支持会话的WebService即可。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/crazystone4/archive/2009/06/20/4285752.aspx
分享到:
相关推荐
总结来说,"axis2-eclipse-codegen-plugin-1.6.2"和"axis2-eclipse-service-plugin-1.6.2"是针对Apache Axis2的Eclipse插件,旨在简化基于Axis2的Web服务开发。通过它们,开发者可以高效地生成和部署服务,同时享受...
"axis2-eclipse-codegen-plugin-1.6.2.zip"和"axis2-eclipse-service-plugin-1.6.2.zip"是强大的开发工具,它们为使用Apache Axis2开发Web服务的Eclipse用户提供了一个友好的环境,使得Web服务的生命周期管理变得...
AXIS2是Apache软件基金会提供的一个轻量级、高性能的Web Service框架,它提供了完整的Web Service生命周期管理,包括生成、部署和服务调用。 ### 简介 AXIS2是构建在SOAP协议上的,它支持SOAP 1.1和1.2版本,并且...
1.7.9.zip_axis2_axis2-idea-plugin_idea导入axis2_"提到了几个关键元素,分别是"axis2"、"idea-plugin"和"idea导入axis2",这暗示了这个压缩包是用于在IntelliJ IDEA这款集成开发环境(IDE)中支持Axis2服务的插件...
描述中提到的"tools的工具包"可能指的是这个压缩包内包含了用于开发和管理Web服务的工具,如服务生成器、测试客户端和部署脚本等。 Apache CXF则是一个全面的开源Web服务框架,它不仅支持SOAP,还支持RESTful...
axis2-eclipse-service-archiver-wizard.zip
标题中的"axis2-eclipse-service-plugin-1.7.4.zip"指的是Axis2 Eclipse服务插件的1.7.4版本的归档文件,它是一个专门为Eclipse集成开发环境(IDE)设计的扩展。这个插件允许开发者在Eclipse中方便地创建、部署和...
共四个文件,都是最先版的,希望可以帮助大家。axis2-eclipse-service-archiver-wizard和axis2-eclipse-codegen-wizard和axis2-1.6.1-bin和axis2-1.6.1-war
### Axis开发Web Service实例详解 #### 一、概述 在探讨如何使用Apache Axis来开发Web Service之前,我们首先需要了解一些基本概念。 **Web Service**是一种标准的技术框架,用于实现不同平台之间的应用通信。它...
总的来说,"axis2-idea-plugin-1.7.8" 是一个强大的工具,可以帮助IntelliJ IDEA用户更便捷地开发和管理基于Axis2的Web服务,提升了开发者的生产力。对于那些频繁处理Web服务的开发人员来说,安装并熟悉这个插件是...
目前axis2最高版本是2.0以上的版本,但是eclipse和myeclipse都不支持,无奈只能使用低版本的插件1.6.3;经实验,可以安装成功;...axis2-eclipse-service-plugin-1.6.3.zip axis2-eclipse-codegen-plugin-1.6.3.zip
总的来说,"axis2-eclipse-codegen-plugin-1.6.2+axis2-eclipse-service-plugin-1.6.2"的组合为Eclipse用户提供了一套完整的Web服务开发解决方案,从生成代码到部署服务,全程都在熟悉的开发环境中完成,极大地提升...
【用Axis2开发Web Service】是本文的核心主题,轴心技术是Java开发Web服务的一种框架,相较于Axis1,其过程更为简洁。以下是关于使用Axis2开发Web Service的详细步骤和知识点: 1. **实验环境搭建**: - 首先确保...
这是一个专门为Eclipse IDE设计的插件,用于帮助开发人员在Eclipse环境中创建、部署和管理基于Apache Axis2的Web服务。 Apache Axis2是Java平台上一个强大的Web服务框架,它提供了高度可扩展性和性能。而Eclipse ...
标题中的"axis.jar"和"axis-saaj-1.4.jar"是两个重要的Java库文件,它们在Web服务开发中扮演着核心角色。本文将详细介绍这两个库以及它们与Web服务的关系。 首先,让我们深入了解Axis。Axis是Apache软件基金会的一...
总结起来,“axis2-eclipse-service-archiver-wizard”是MyEclipse中用于Axis2服务开发的重要工具,它通过提供直观的向导界面,提高了开发效率,使得在Eclipse环境中构建和管理Axis2 Web服务变得更加容易。...
AXIS Web Service是一种基于Java的开源工具,用于创建和部署Web服务。它是Apache软件基金会的项目,主要用于简化SOAP(简单对象访问协议)处理,使得开发人员可以轻松地将Java类转换为Web服务或调用远程Web服务。在...
Axis是Apache软件基金会开发的一个开源Java库,主要用于创建和使用Web服务。本文将深入讲解基于Java的Axis Web服务,以及如何通过一个实际案例来理解其工作原理。 1. Axis简介: Axis是Java平台上流行的Web服务...
【Axis2 Web Service 开发教程】是一份详细指导开发者如何使用Apache Axis2框架创建和部署Web服务的教学资料。Apache Axis2是Java世界中一个强大的Web服务引擎,它提供了高效的性能和灵活的架构,使得Web服务的开发...