当多个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 [email protected] * @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 [email protected] * @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 [email protected] * @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",new Object[] { "msg" },new Class[] { String.class }); System.out.println(result[0]); qname = new QName("http://service.hoo.com",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中的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。