当多个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元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。
【本文对您有帮助就好】元