对于axis2会话管理详解请参见Axis2的session(会话)管理,本文主要是对两种常用状态状态的java代码的实现。
一、TransportSession
设置同一个web service 的session管理
实现同一个web service 的Session管理需要如下三步:
- 使用MessageContext和ServiceContext获得和设置key-value对
- 为要进行Session管理的web service类所对应的<service>元素添加一个scope属性,并将该属性的值设为transportsession。
- 在客户端使用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管理
实现跨服务会话管理,基本有如下三步:
- 使用MessageContext和ServiceGroupContext获得和设置key-value对
- 为要进行Session管理的web service类所对应的<service>元素添加一个scope属性,并将该属性的值设为application。
- 在客户端使用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();
}
}
}