axis2系列之会话(session)管理

对于axis2会话管理详解请参见Axis2的session(会话)管理,本文主要是对两种常用状态状态的java代码的实现。

一、TransportSession

设置同一个web service 的session管理
实现同一个web service 的Session管理需要如下三步:
  1. 使用MessageContext和ServiceContext获得和设置key-value对
  2. 为要进行Session管理的web service类所对应的<service>元素添加一个scope属性,并将该属性的值设为transportsession
  3. 在客户端使用setManageSession(true)打开session管理功能。
1、服务器

public class LoginService {

	public boolean login(String username,String password){
		
		if("bill".equals(username) && "123".equals(password)){
			User user = new User();
			user.setUsername(username);
			user.setPassword(password);
			//登录成功
			//第一步:设置key-value对
			MessageContext mc = MessageContext.getCurrentMessageContext();
			ServiceContext sc = mc.getServiceContext();
			sc.setProperty("user", user);
			return true;
		}else{
			return false;
		}
	}
	
	public User getLoginMsg(){
		MessageContext mc = MessageContext.getCurrentMessageContext();
		ServiceContext sc = mc.getServiceContext();
		return (User) sc.getProperty("user");
	}
	
}
2、services.xml文件配置
<!-- 同一个web service 的session会话管理  在相应的service上设置scope属性,必须是小写-->
<service name="loginService" scope="transportsession">
	<description>
		web service session会话管理测试
	</description>
	<parameter name="ServiceClass">
		com.test.sessionManager.service.LoginService
	</parameter>
	<!-- 
		在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理
		WebService 方法的处理器。
		具有返回值的方法,需要使用可处理输入输出的RPCMessageReceiver类,
		没有返回值的方法,需要使用只能处理输入的RPCInOnlyMessageReceiver 类。
	 -->
	<operation name="login">
		<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</operation>
	<operation name="getLoginMsg">
		<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</operation>
</service>
3、客户端
public class LoginServiceClient {
	public static void main(String[] args) {
		RPCServiceClient client = null;
		try {
			client = new RPCServiceClient();
			Options options = client.getOptions();
			EndpointReference targetRPC = new EndpointReference("http://localhost:8080/axis2/services/loginService");
			options.setTo(targetRPC);
			//客户端开启session会话管理
			options.setManageSession(true);
			
			//登录测试
			QName qName = new QName("http://service.sessionManager.test.com","login");
			Object[] oArgs = new Object[]{"bill","123"};
			Class[] rtnType = new Class[]{Boolean.class};
			Boolean isLogin = (Boolean) client.invokeBlocking(qName, oArgs, rtnType)[0];
			if(isLogin){
				System.out.println("登录成功!");
				//获得登录信息
				qName = new QName("http://service.sessionManager.test.com","getLoginMsg");
				oArgs = new Object[]{};
				rtnType = new Class[]{User.class};
				User user = (User) client.invokeBlocking(qName, oArgs, rtnType)[0];
				System.out.println("欢迎您:"+user.getUsername());
			}else{
				System.out.println("登录失败!");
			}
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
二、Application
设置跨web service 服务的session管理
实现跨服务会话管理,基本有如下三步:
  1. 使用MessageContext和ServiceGroupContext获得和设置key-value对
  2. 为要进行Session管理的web service类所对应的<service>元素添加一个scope属性,并将该属性的值设为application
  3. 在客户端使用setManageSession(true)打开session管理功能。
1、服务器
/**
 * 跨服务会话管理:登录service
 * 
 */
public class BoastLoginService {

	public boolean login(String username,String password){
		if("bill".equals(username) && "123".equals(password)){
			//登录成功
			User user = new User();
			user.setUsername(username);
			user.setPassword(password);
			
			MessageContext mc = MessageContext.getCurrentMessageContext();
			ServiceGroupContext sgc = mc.getServiceGroupContext();
			sgc.setProperty("user", user);
			return true;
		}else{
			return false;
		}
	}
}
/**
 * 夸服务会话管理:查询Service
 * @author Administrator
 *
 */
public class SearchService {

	public User getLoginUser(){
		MessageContext mc = MessageContext.getCurrentMessageContext();
		ServiceGroupContext sgc = mc.getServiceGroupContext();
		return (User) sgc.getProperty("user");
	}
}
2、services.xml文件
<!-- 跨服务的web service 的session会话管理 -->
<service name="boastLoginService" scope="application">
	<description>
		web service session会话管理测试
	</description>
	<parameter name="ServiceClass">
		com.test.boastservice.sessionManager.service.BoastLoginService
	</parameter>
	<operation name="login">
		<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</operation>
</service>
<service name="searchService" scope="application">
	<description>
		web service session会话管理测试
	</description>
	<parameter name="ServiceClass">
		com.test.boastservice.sessionManager.service.SearchService
	</parameter>
	<operation name="getLoginUser">
		<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
	</operation>
</service>
3、客户端
public class BoastSessionServiceClient {

	public static void main(String[] args) {
		try {
			RPCServiceClient client = new RPCServiceClient();
			Options options = client.getOptions();
			EndpointReference targetRPC = new EndpointReference("http://localhost:8080/mywebservice/services/boastLoginService");
			options.setTo(targetRPC);
			//开启客户端session会话管理
			options.setManageSession(true);
			
			//登录测试
			QName qName = new QName("http://test.com","login");
			Object[] oArgs = new Object[]{"bill","123"};
			Class[] rtnType = new Class[]{Boolean.class};
			Boolean isLogin = (Boolean) client.invokeBlocking(qName, oArgs, rtnType)[0];
			if(isLogin){
				System.out.println("登录成功!!!");
			}else{
				System.out.println("登录失败!!!");
			}
		} catch (AxisFault e) {
			e.printStackTrace();
		}
	}
}
public class SearchServiceClient {

	public static void main(String[] args) {
		try {
			RPCServiceClient client = new RPCServiceClient();
			Options options = client.getOptions();
			EndpointReference targetRPC = new EndpointReference("http://localhost:8080/axis2/services/searchService");
			options.setTo(targetRPC);
			//开启客户端session会话管理
			options.setManageSession(true);
			
			//登录测试
			QName qName = new QName("http://service.sessionManager.boastservice.test.com","getLoginUser");
			Object[] oArgs = new Object[]{};
			Class[] rtnType = new Class[]{User.class};
			User user = (User) client.invokeBlocking(qName, oArgs, rtnType)[0];
			if(user != null){
				System.out.println("欢迎您:"+user.getUsername());
			}else{
				System.out.println("用户未登录");
			}
		} catch (AxisFault e) {
			e.printStackTrace();
		}
	}
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值