之前学习了同一服务中的session管理点击打开链接,今天来看一下跨服务的session管理,本来昨天晚上把服务器端都写好了,只剩下客户端的代码了,无奈,下班了,只好今天早上接着写了,也好就当是复习了。
对于一个复杂的系统,不可能只有一个WebService服务,例如,至少会有一个管理用户的WebService(用户登录和注册)以及处理业务的WebService。象这种情况,就必须在多个WebService服务之间共享会话状态,也称为跨服务会话(Session)管理。实现跨服务会话管理与实现同一个服务的会话管理的步骤类似,但仍然有一些差别,实现跨服务会话管理的步骤如下:
实现跨服务的Session管理需要如下三步:
1. 使用MessageContext和ServiceGroupContext获得与设置key-value对。
2. 为要进行Session管理的WebService类所对应的
3. 在客户端使用setManageSession(true)打开Session管理功能。
从上面的步骤可以看出,实现跨服务会话管理与实现同一个服务的会话管理在前两步上存在着差异,而第3步是完全一样的。下面是一个跨服务的会话管理的实例。在这个例子中有两个WebService类:LoginService和SearchService,代码如下:
[java] package crossSession;
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");
}
}
[java]
package crossSession;
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文件中的配置代码如下:
[html]
登录服务
crossSession.LoginService
搜索服务
crossSession.SearchService
第3步与点击打开链接一文中介绍的方法类似。
下面是使用两个stub类的对象实例访问上面实现的两个WebService的客户端代码:(由于是两个service,所以要分别实现两个stub类)
[java]
package crossSession;
import java.rmi.RemoteException;
public class LoginSearchStubClient {
public static void main(String[] args) throws RemoteException {
// TODO Auto-generated method stub
LoginSessionStub lss = new LoginSessionStub();
LoginSessionStub.Login login = new LoginSessionStub.Login();
LoginSessionStub.GetLoginMsg glm = new LoginSessionStub.GetLoginMsg();
login.setUsername("bill");
login.setPassword("1234");
if(lss.login(login).local_return){
System.out.println