六、 跨多个WebService管理Session

来源:互联网 发布:zookeeper源码阅读 编辑:程序博客网 时间:2024/05/12 02:56

当多个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中的内容。

转载自:hoojo

原文地址:http://www.cnblogs.com/hoojo/archive/2011/03/16/1985704.html


0 0
原创粉丝点击