五、WebService会话Session的管理
来源:互联网 发布:zookeeper源码阅读 编辑:程序博客网 时间:2024/05/22 05:20
1、新建Session的WebService测试代码,代码很简单。就是记录用户登录的状态信息,放在MessageContext的ServiceContext中。代码如下:
package com.hoo.service;import org.apache.axis2.context.MessageContext;import org.apache.axis2.context.ServiceContext;/** * <b>function:</b>WebService Session会话消息 * @author hoojo * @createDate 2011-3-8 下午04:11:27 * @file LoginService.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */public class LoginService {public boolean login(String userName, String password) {MessageContext context = MessageContext.getCurrentMessageContext();ServiceContext ctx = context.getServiceContext();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();ServiceContext ctx = context.getServiceContext();return ctx.getProperty("userName") + "#" + ctx.getProperty("msg");}}这里保存Session信息的主要是通过MessageContext这个上下文来获取ServiceContext的上下文,然后通过setProperty来保存session的信息,通过getProperty来获取session信息。
Session的作用可以在使用WebService登录的时候,保存用户的登录状态或是会话消息。但是使用session需要设置发布Service的时候,设置WebService的作用域。作用域默认是request,它还有另外三个值,分别是:application、soapsession、transportsession;我们可以选择使用transportsession和application分别实现同一个WebService类和跨WebService类的会话管理。
2、使用axis2的工具生成aar文件,并发布LoginService服务。
关于这里发布LoginService的步骤就不一一介绍,上面已经有说过了。当你用这个步骤发布WebService的时候,你可以打开压缩文件的方式aar文件(其实不一定要用aar文件,只是官方推荐的aar,jar文件也是可以的),在META-INF目录下有一个services.xml文件,看到它的<service>这个标签,没有设置scope属性。
scope默认的是request,我们得修改services.xml的内容。
修改后services.xml内容如下:
<service name="LoginService" scope="transportsession"><description>Please Type your service description here</description><messageReceivers><messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /><messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /></messageReceivers><parameter name="ServiceClass">com.hoo.service.LoginService</parameter></service>这个地方的scope是关键,如果这里不设置的话session是无法存放信息。
3、用控制台Dos命令发布WebService
这个是手工打包,也就是我们经常用的jar命令
首先我们得需要一个services.xml文件,文件内容如上面的。
<service name="LoginService" scope="transportsession">
name是当前发布WebService的名称,scope是会话作用域。保存在Session中就要用这个transportsession这个作用域。
<parameter name="ServiceClass">com.hoo.service.LoginService</parameter>
这个是当前Service的类路径,包名+类名
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
这个应该是参数和返回值信息的解析类,in-only是输入也就是参数,in-out是输出也就是返回值。
A、 首先,我们在C盘下新建一个sessionService的目录,然后将上面的services.xml文件中的ServiceClass的类的class文件copy到这个目录下,注意要带上package目录,然后在sessionService目录下新建一个META-INF将上面的services.xml文件放到这个目录下
B、 然后运行cmd进入控制台,进入sessionService这个目录,键入命令如下:
jar cvf service.aar .
service.aar是打包后的文件名称,.是指代当前目录
如果你不懂jar命令,你可以输入jar会有命令语法的提示
进入sessionService这个目录中,你可以看到service.aar文件就有了。然后将这个文件copy到axis2的WEB-INF目录下的services目录中,也就是
[tomcat-home]\webapps\axis2\WEB-INF\services
然后可以通过:http://localhost:8080/axis2/services/listServices
就可以查看刚才发布的服务了。
这样就完成手工发布打包发布WebService了
C、 编写WebService客户端的请求代码
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>LoginService Session客户端代码 * @author hoojo * @createDate 2011-3-9 上午11:21:59 * @file LoginServiceClient.java * @package com.hoo.service * @project Axis2WebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */public class LoginServiceClient {public static void main(String[] args) throws AxisFault {String target = "http://localhost:8080/axis2/services/LoginService";//target = "http://localhost:8080/axis2/services/MyLoginService";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]);}}执行后,结果如下:
true
admin#登陆成功
上面要说明的是options.setManageSession(true);是开启对Session管理的支持
转载自:hoojo
原文地址:http://www.cnblogs.com/hoojo/archive/2011/03/16/1985699.html
- 五、WebService会话Session的管理
- 五、WebService会话Session的管理
- WebService会话Session的管理
- WebService之Axis2系列教程(五)会话(Session)管理
- Axis2 WebService之会话管理(Session)
- WebService大讲堂之Axis2(5):会话(Session)管理
- WebService大讲堂之Axis2(6):跨服务会话(Session)管理
- WebService大讲堂之Axis2(5):会话(Session)管理
- WebService大讲堂之Axis2(6):跨服务会话(Session)管理
- WebService大讲堂之Axis2(6):跨服务会话(Session)管理
- WebService大讲堂之Axis2(5):会话(Session)管理
- WebService大讲堂之Axis2(5):会话(Session)管理
- WebService大讲堂之Axis2(6):跨服务会话(Session)管理
- WebService大讲堂之Axis2(5):会话(Session)管理
- WebService大讲堂之Axis2(6):跨服务会话(Session)管理
- WebService大讲堂之Axis2(5):会话(Session)管理
- WebService大讲堂之Axis2(6):跨服务会话(Session)管理
- axis2开发webservice之会话(Session)管理
- QML类型说明-Button
- php 数组删除特定元素以及比较两个数组的不同
- 职场分享--为什么努力工作却没有换来升职
- 如何为锁屏设置一张不同于launcher的,固定加载的背景图片
- 利用talend将数据从orcale抽取,存到hive
- 五、WebService会话Session的管理
- 马尔可夫模型
- 六、 跨多个WebService管理Session
- 大端模式与小端模式的详解分析
- C语言宏定义##连接符和#符的使用
- 以一般化视角串联霍夫变换,从直线到圆再到广义霍夫变换
- Linux用户态和内核态
- Leetcode: Binary Tree Level Order Traversal
- Openstack学习笔记(一)——入门