加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Axis跨多个Webservice进行的Session管理

发布时间:2020-12-17 01:06:58 所属栏目:安全 来源:网络整理
导读:当多个WebService的时候,我们要管理它的Session。这个时候我们得依靠ServiceGroupContext保存session信息;然后在发布WebService的时候,services.xml文件的的service表情的scope就不再说request或是transportsession了,而是application;最后同样要开启对

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


1. ?服务端代码,有俩个,需要编写俩个service

?? ??

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信息的
 * @author linwei
 *
 */
public class SearchSessionService {

	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 + ">的数据";
		}
	}

}

和前一篇的Session一样的操作,只不过是用ServiceGroupContext上下文来存取session信息。

2. services.xml配置文件的内容如下,编写完毕后,在把对应的classes以及其路径放置对应文件夹,打包

<serviceGroup>
	<service name="LoginSessionService" scope="application">
		<description>
			Web Service Session例子
		</description>
		<parameter name="ServiceClass">
			server.perfect.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">
			server.perfect.SearchSessionService  
		</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. 客户端代码:

???

package client;

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;

public class LoginSessionServiceTest {

	
	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://perfect.server","login");
		//指定调用的方法和传递参数数据,及设置返回值的类型
		Object[] result = client.invokeBlocking(qname,new Object[] { "admin","123456" },new Class[] { boolean.class });
		System.out.println(result[0]);
		
		qname = new QName("http://perfect.server","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://perfect.server","findSessionMessage");
		result = client.invokeBlocking(qname,new Object[] { "userName" },new Class[] { String.class });
		System.out.println(result[0]);
		
		qname = new QName("http://perfect.server",new Object[] { "msg" },new Object[] { "password" },new Class[] { String.class });
		System.out.println(result[0]);
	}
	
}

运行后结果如下: true admin#登陆成功 找到的数据<userName,admin> 找到的数据<msg,登陆成功> 找到的数据<password,123456> 如果将services.xml文件<service name="SearchSessionService" scope="application">的内容改成scope=transportsession,看看什么情况。是不是找不到session中的内容。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读