`

Axis2-04 WebService中Session的管理

阅读更多

 

一、Axis2 WebService会话Session的管理

 

1、新建SessionWebService测试代码

代码很简单。就是记录用户登录的状态信息,放在MessageContextServiceContext中:

package com.iflytek.service;

import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceContext;

/**
 * @author xdwang
 * 
 * @create Apr 25, 2013 3:20:12 PM
 * 
 * @email:xdwangiflytek@gmail.com
 * 
 * @description WebService Session会话消息
 * 
 * 
 */
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,它还有另外三个值,分别是:applicationsoapsessiontransportsession;我们可以选择使用transportsessionapplication分别实现同一个WebService类和跨WebService类的会话管理。

 

2、使用axis2的工具生成aar文件,并发布LoginService服务

      关于这里发布LoginService的步骤就不一一介绍,上篇博客已经有说过了。当你用这个步骤发布WebService的时候,你可以打开压缩文件的方式aar文件(其实不一定要用aar文件,只是官方推荐的aarjar文件也是可以的),在META-INF目录下有一个services.xml文件,看到它的<service>这个标签,没有设置scope属性。

       scope默认的是request,我们得修改services.xml的内容。修改后services.xml内容如下:

<service name="SessionAxisWB" 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.iflytek.service.LoginService</parameter>
</service>

 

 

    这个地方的scope是关键,如果这里不设置的话session是无法存放信息。

到此,一个服务的arr文件已经生成,将此文件移至之前部署的axis2。即apache-tomcat\webapps\axis2\WEB-INF\services下重启tomcat,然后可以通过:http://localhost:8080/axis2/services/listServices就可以查看刚才发布的服务了。

 

3、编写WebService客户端的请求代码

 

package com.iflytek.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;

/**
 * @author xdwang
 * 
 * @create Apr 25, 2013 3:34:09 PM
 * 
 * @email:xdwangiflytek@gmail.com
 * 
 * @description LoginService Session客户端代码
 * 
 */
public class LoginServiceClient {
	public static void main(String[] args) throws AxisFault {
		String target = "http://localhost:8080/axis2/services/SessionAxisWB";
		RPCServiceClient client = new RPCServiceClient();
		Options options = client.getOptions();
		options.setManageSession(true);// 开启对Session管理的支持

		EndpointReference epr = new EndpointReference(target);
		options.setTo(epr);
		
		//targetNamespace
		QName qname = new QName("http://service.iflytek.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.iflytek.com", "getLoginMessage");
		result = client.invokeBlocking(qname, new Object[] { null },
				new Class[] { String.class });
		System.out.println(result[0]);
	}

}

 运行结果:

true
admin#登陆成功

 上面要说明的是options.setManageSession(true);是开启对Session管理的支持

 

二、Axis2跨多个WebService管理Session

        当多个WebService的时候,我们要管理它的Session。这个时候我们得依靠ServiceGroupContext保存session信息;然后在发布WebService的时候,services.xml文件的的service表情的scope就不再说request或是transportsession了,而是application;最后同样要开启对session的管理,即options.setManageSession(true);

 

1、首先多个WebServicesession管理

 

package com.iflytek.service;

import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceGroupContext;

/**
 * @author xdwang
 * 
 * @create Apr 25, 2013 3:46:54 PM
 * 
 * @email:xdwangiflytek@gmail.com
 * 
 * @description 管理多个会话Session信息
 * 
 */
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.iflytek.service;

import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceGroupContext;

/**
 * @author xdwang
 * 
 * @create Apr 25, 2013 3:48:20 PM
 * 
 * @email:xdwangiflytek@gmail.com
 * 
 * @description 查找多服务Session会话中的消息
 * 
 */
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、发布WebService

通过Eclipse生成.aar文件,然后手动修改里面的services.xml为(这里还没有找到如何直接在Eclipse中添加):

<serviceGroup>
	<service name="LoginSessionService" scope="application">
		<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.iflytek.service.LoginSessionService</parameter>
	</service>
	<service name="SearchSessionServcie " scope="application">
		<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.iflytek.service.SearchSessionServcie</parameter>
	</service>
</serviceGroup>

  说明:

1、  如果只有一个service,则不需要serviceGroup

2、  Service节点下的name是当前发布WebService的名称,scope是会话作用域。保存在Session中就要用这个transportsession这个作用域;

3、  Parameter表示这个是当前Service的类路径,包名+类名;

4、  messageReceivers应该是参数和返回值信息的解析类,in-only是输入也就是参数,in-out是输出也就是返回值。

 

3、编写客户端的测试代码

发布完成后,可以通过http://localhost:8080/axis2/services/listServices查看发布的WebService服务,ok,编写客户端代码:

 

package com.iflytek.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;

/**
 * @author xdwang
 * 
 * @create Apr 25, 2013 4:10:50 PM
 * 
 * @email:xdwangiflytek@gmail.com
 * 
 * @description 多会话Session管理,WebService客户端请求代码
 * 
 */
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.iflytek.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.iflytek.com", "getLoginMessage");
		result = client.invokeBlocking(qname, new Object[] { null },
				new Class[] { String.class });
		System.out.println(result[0]);

		target = "http://localhost:8080/axis2/services/SearchSessionServcie";
		epr = new EndpointReference(target);
		options.setTo(epr);

		qname = new QName("http://service.iflytek.com", "findSessionMessage");
		result = client.invokeBlocking(qname, new Object[] { "userName" },
				new Class[] { String.class });
		System.out.println(result[0]);
		qname = new QName("http://service.iflytek.com", "findSessionMessage");
		result = client.invokeBlocking(qname, new Object[] { "msg" },
				new Class[] { String.class });
		System.out.println(result[0]);

		qname = new QName("http://service.iflytek.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中的内容

分享到:
评论

相关推荐

    axis2+spring webservice

    简单例子:axis2整合spring发布webservice,以及session的管理

    axis2;WebService

    Axis WebService会话Session的管理 Axis用控制台Dos命令发布WebService Axis跨多个WebService管理Session Axis用Spring的JavaBean发布WebService Axis异步调用WebService Axis 的Module模块 Axis使用SoapMonitar监视...

    axis2_WebService_开发指南

    Axis WebService 会话Session 的管理 Axis 用控制台Dos 命令发布WebService Axis 跨多个WebService 管理Session Axis 用Spring 的JavaBean 发布WebService Axis 异步调用WebService Axis 的Module 模块 Axis 使用...

    axis2_webservice

    Axis的简单准备 Axis的入门实例 ...Axis跨多个WebService管理Session Axis用Spring的JavaBean发布WebService Axis异步调用WebService Axis的Module模块 Axis使用SoapMonitar监视WebService的请求和响应信息

    webservice6 跨越session管理

    webservice6 跨越session管理

    axis2-1.4.1及教程

    1):用POJO实现0配置的WebService 2):复合类型数据的传递 3):使用services.xml文件发布WebService 4):二进制文件传输 ...9):编写Axis2模块(Module) 10):使用soapmonitor模块监视soap请求与响应消息

    WebService大讲堂之Axis2系列教程

    Axis2是目前比较流行的WebService引擎。...本课程站在初学者角度介绍了Axis2的大多数常用的功能,例如,以多种方式编写和发布WebService、JAX-RPC、JAX-WS、复杂类型传输、WebService会话管理、Axis2模块等

    Axis2 WebService 开发指南 技术文档 入门文档

    Axis WebService会话Session的管理 Axis用控制台Dos命令发布WebService Axis跨多个WebService管理Session Axis用Spring的JavaBean发布WebService Axis异步调用WebService Axis 的Module模块 Axis使用...

    在自己的项目中利用axis2+spring发布webservice与客户端调用包括session

    NULL 博文链接:https://lichaobao.iteye.com/blog/2142754

    WebService大讲堂之Axis2

    WebService大讲堂之Axis2(5):会话(Session)管理 .................................................................................... 20 WebService大讲堂之Axis2(6):跨服务会话(Session)管理 ...............

    Axis2教程 包含描述目录的内容

    WebService大讲堂之Axis2系列教程 1. 用POJO实现0配置的WebService 2. 复合类型数据的传递 3. 使用services.xml文件发布WebService 4. 二进制文件传输 5. 会话(Session)管理 6. 跨服务会话(Session)管理 ...

    axis2新手教程

    axis2中service.xml,session管理,module扩展

    axis2 教程_个人备用文档

    1. 用POJO实现0配置的WebService 2. 复合类型数据的传递 3. 使用services.xml文件发布WebService 4.... 5. 会话(Session)管理 ... 编写Axis2模块(Module) 10. 使用soapmonitor模块监视soap请求与响应消息

    编程入门_Eclipse教程

    3.1.3. WebService会话Session的管理 24 3.1.4. 用Spring创建的JavaBean发布成WebService 29 3.1.5. 异步调用WebService 32 4. Eclipse中安装 Lomboz 35 4.1. 持久化对象与OID 35 4.1.1. 对持久化对象的要求 35 ...

    AXIS2大讲堂文档

    文档1 pojo实现0配置 文档2 符合数据类型 文档3 使用services.xml发布...文档6 跨越session管理 文档7 spring的bean发布为webservice 文档8 异步调用webservice 文档9 编写axis模块 文档10 使用moniter监视器

    axis2编写发布和例子详解

    axis2入门学习资料,通过10个步骤详细例子(测试都能运行),简单阐述了ajax通过tomcat发布方法,session管理,异步调用和同步调用,spring整合等功能,说明,配置比较详细

    金蝶BOSV6.1_业务组件API参考手册

    com.kingdee.bos.framework.session.template com.kingdee.bos.hotdeploy com.kingdee.bos.invokecounter com.kingdee.bos.jcache com.kingdee.bos.jcache.impl com.kingdee.bos.jcache.jgroups ...

Global site tag (gtag.js) - Google Analytics