当多个WebService的时候,我们要管理它的Session。这个时候我们得依靠ServiceGroupContext保存session信息;然后在发布WebService的时候,services.xml文件的的service表情的scope就不再说request或是transportsession了,而是application;最后同样要开启对session的管理,即options.setManageSession( true );
1、 首先多个WebService的session管理的代码如下:
代码
package
com.hoo.service;
import
org.apache.axis2.context.MessageContext;
import
org.apache.axis2.context.ServiceGroupContext;
/** * <b>function:</b>管理多个会话Session信息 * @author hoojo * @createDate 2011-3-9 下午05:11:07 * @file LoginSessionService.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */
public
class
LoginSessionService {
public
boolean
login(String userName, String password) {
MessageContext context = MessageContext.getCurrentMessageContext();
ServiceGroupContext ctx = context.getServiceGroupContext();
if
("
admin
".equals(userName) && "
123456
".equals(password)) {
ctx.setProperty("
userName
", userName);
ctx.setProperty("
password
", password);
ctx.setProperty("
msg
", "
登陆成功
");
return
true
;
}
ctx.setProperty("
msg
", "
登陆失败
");
return
false
;
}
public
String getLoginMessage() {
MessageContext context = MessageContext.getCurrentMessageContext();
ServiceGroupContext ctx = context.getServiceGroupContext();
return
ctx.getProperty("
userName
") + "
#
" + ctx.getProperty("
msg
");
}
}
和上面的Session一样的操作,只不过是用ServiceGroupContext上下文来存取session信息
另外还需要用一个Service来查询session的信息,SearchService的代码如下:
代码
package
com.hoo.service;
import
org.apache.axis2.context.MessageContext;
import
org.apache.axis2.context.ServiceGroupContext;
/** * <b>function:</b>查找多服务Session会话中的消息 * @author hoojo * @createDate 2011-3-9 下午05:22:39 * @file SearchSessionServcie.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */
public
class
SearchSessionServcie {
public
String findSessionMessage(String key) {
MessageContext mc = MessageContext.getCurrentMessageContext();
ServiceGroupContext ctx = mc.getServiceGroupContext();
if
(ctx.getProperty(key) !=
null
) {
return
"
找到的数据<
" + key + "
,
" + ctx.getProperty(key) + "
>
";
}
else
{
return
"
没有找到<
" + key + "
>的数据
";
}
}
}
2、 编写services.xml来发布这2个服务,还以前不一样的。这一次是用一个services.xml文件配置2个service,同时发布2个服务。Xml代码如下:
代码
<
serviceGroup
>
<
service
name
=
"LoginSessionService"
scope
=
"application"
>
<
description
>
Web Service Session例子
</
description
>
<
parameter
name
=
"ServiceClass"
>
com.hoo.service.LoginSessionService
</
parameter
>
<
messageReceivers
>
<
messageReceiver
mep
=
"http://www.w3.org/2004/08/wsdl/in-out"
class
=
"org.apache.axis2.rpc.receivers.RPCMessageReceiver"
/>
<
messageReceiver
mep
=
"http://www.w3.org/2004/08/wsdl/in-only"
class
=
"org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"
/>
</
messageReceivers
>
</
service
>
<
service
name
=
"SearchSessionService"
scope
=
"application"
>
<
description
>
Web Service Search Session例子
</
description
>
<
parameter
name
=
"ServiceClass"
>
com.hoo.service.SearchSessionServcie
</
parameter
>
<
messageReceivers
>
<
messageReceiver
mep
=
"http://www.w3.org/2004/08/wsdl/in-out"
class
=
"org.apache.axis2.rpc.receivers.RPCMessageReceiver"
/>
<
messageReceiver
mep
=
"http://www.w3.org/2004/08/wsdl/in-only"
class
=
"org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"
/>
</
messageReceivers
>
</
service
>
</
serviceGroup
>
3、 发布完成后,可以通过 http://localhost:8080/axis2/services/listServices 查看发布的WebService服务,编写客户端的测试代码,code如下:
代码
package
com.hoo.service;
import
javax.xml.namespace.QName;
import
org.apache.axis2.AxisFault;
import
org.apache.axis2.addressing.EndpointReference;
import
org.apache.axis2.client.Options;
import
org.apache.axis2.rpc.client.RPCServiceClient;
/** * <b>function:</b>多会话Session管理,WebService客户端请求代码 * @author hoojo * @createDate 2011-3-9 下午05:17:15 * @file LoginSessionServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */
public
class
LoginSessionServiceClient {
public
static
void
main(String[] args)
throws
AxisFault {
String target = "
http://localhost:8080/axis2/services/LoginSessionService
";
RPCServiceClient client =
new
RPCServiceClient();
Options options = client.getOptions();
options.setManageSession(
true
);
EndpointReference epr =
new
EndpointReference(target);
options.setTo(epr);
QName qname =
new
QName("
http://service.hoo.com
", "
login
");
//指定调用的方法和传递参数数据,及设置返回值的类型
Object[] result = client.invokeBlocking(qname,
new
Object[] { "
admin
", "
123456
" },
new
Class[] {
boolean
.
class
});
System.out.println(result[0]);
qname =
new
QName("
http://service.hoo.com
", "
getLoginMessage
");
result = client.invokeBlocking(qname,
new
Object[] {
null
},
new
Class[] { String.
class
});
System.out.println(result[0]);
target = "
http://localhost:8080/axis2/services/SearchSessionService
";
epr =
new
EndpointReference(target);
options.setTo(epr);
qname =
new
QName("
http://service.hoo.com
", "
findSessionMessage
");
result = client.invokeBlocking(qname,
new
Object[] { "
userName
" },
new
Class[] { String.
class
});
System.out.println(result[0]);
qname =
new
QName("
http://service.hoo.com
", "
findSessionMessage
");
result = client.invokeBlocking(qname,
new
Object[] { "
msg
" },
new
Class[] { String.
class
});
System.out.println(result[0]);
qname =
new
QName("
http://service.hoo.com
", "
findSessionMessage
");
result = client.invokeBlocking(qname,
new
Object[] { "
password
" },
new
Class[] { String.
class
});
System.out.println(result[0]);
}
}
运行后结果如下:
true
admin#登陆成功
找到的数据<userName, admin>
找到的数据<msg, 登陆成功>
找到的数据<password, 123456>
4、 如果将services.xml文件<service name= "SearchSessionService" scope= "application" >的内容改成scope=transportsession,看看什么情况。是不是找不到session中的内容。
更多文章、技术交流、商务合作、联系博主
微信扫码或搜索:z360901061
微信扫一扫加我为好友
QQ号联系: 360901061
您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
【本文对您有帮助就好】元

