`

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-WebService-开发指南.docx

    Axis2 提供了 Session 管理机制,可以管理多个 WebService 的会话,实现了会话的复用和共享。 7. Axis2 的异步调用: Axis2 支持异步调用,可以实现异步调用 WebService,提高系统的性能和可扩展性。 8. Axis2 ...

    axis2+spring webservice

    描述中提到的“简单例子:axis2整合spring发布webservice”,意味着我们将学习如何将这两个框架结合,以便通过Spring来管理和控制Web服务的生命周期,同时利用Axis2的Web服务处理能力。此外,“以及session的管理”...

    axis2;WebService

    【Axis2 WebService 开发指南】是关于使用Apache Axis2框架创建和操作Web...这个指南覆盖了Axis2的基本使用,包括从创建简单的服务到复杂的会话管理和扩展性,对于理解和实践Axis2 WebService开发具有很高的参考价值。

    webservice6 跨越session管理

    本文将深入探讨在Axis2框架下实现跨服务Session管理的原理和步骤。 首先,我们要理解什么是Session。在Web开发中,Session是服务器用来存储特定用户会话信息的一种机制。通常,Session用于跟踪用户状态,比如用户...

    axis2_WebService_开发指南

    此外,Axis2还提供了辅助工具来发布和调用WebService,以及管理WebService会话(Session)。会话管理在处理有状态的服务时尤为重要。 在某些情况下,可能会需要使用控制台命令(如Dos命令)来发布WebService,Axis2...

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

    标题中的“在自己的项目中利用axis2+spring发布webservice与客户端调用包括session”指出的是一个关于在实际项目开发中如何使用Axis2和Spring框架来发布Web服务,并且涉及了Web服务客户端调用以及会话(session)...

    Axis2集成SSH搭建WebService支持事务(图文详解含核心代码)

    通过本教程,你将了解到如何按照传统的SSH方式编写代码,如何利用Axis2发布WebService,以及如何在一个项目中配置多个WebService接口。此外,还会探讨提高WebService安全性的一些建议,并提供服务端和客户端的测试...

    axis2-1.4.1及教程

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

    axis2 webservice基础教程

    - **概念介绍**:在Axis2中,可以通过简单的POJO(Plain Old Java Object)实现WebService的发布,无需复杂的配置文件。 - **示例代码**:以下是一个简单的POJO示例,展示了如何创建一个WebService。 ```java ...

    WebService大讲堂之Axis2.pdf

    - **概念**: 在 Axis2 中可以通过简单的 POJO 类直接发布 WebService,无需复杂的配置文件。 - **示例**: - **POJO 类**: `SimpleService` ```java public class SimpleService { public String getGreeting...

    WebService大讲堂之Axis2系列教程

    4. **WebService会话管理**:会话管理在保持用户状态和服务交互连续性方面至关重要,课程会介绍如何在Axis2中实现和维护会话。 5. **Axis2模块**:模块是Axis2中的一个重要概念,它们允许你扩展Axis2的功能,比如...

Global site tag (gtag.js) - Google Analytics