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

Axis单个Webservice的session管理

发布时间:2020-12-17 01:06:59 所属栏目:安全 来源:网络整理
导读:1. ?首先,还是先编写服务端的代码,服务端代码中用来记录用户登录的状态信息,并放在MessageContext的ServiceContext中,具体代码如下: ?? ? ? /** * WebService Session会话消息 * @author linwei * */public class LoginService {public boolean login(S

1. ?首先,还是先编写服务端的代码,服务端代码中用来记录用户登录的状态信息,并放在MessageContext的ServiceContext中,具体代码如下:

?? ? ?

/**
 * WebService Session会话消息
 * @author linwei
 *
 */
public class LoginService {

	public boolean login(String userName,String password) {
		//通过MessageContext来进行session的管理
		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. ?需要编写services.xml文件的内容,scope默认的是request,这个地方的scope是关键,如果这里不设置的话session是无法存放信息。

??编码如下:

<service name="loginService" scope="transportsession">
    <description>
         description
    </description>
	<!-- 这个应该是参数和返回值信息的解析类,in-only是输入也就是参数,in-out是输出也就是返回值。 -->
    <parameter name="ServiceClass">server.perfect.LoginService</parameter>
	<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>
</service>

?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 LoginServiceTest {

	public static void main(String[] args) throws AxisFault {
		
		//RPCServiceClient是RPC方式调用
		RPCServiceClient client = new RPCServiceClient();
		Options options = client.getOptions(); 
		//设置调用WebService的URL 
		String address = "http://localhost:8080/axis2/services/loginService";
		EndpointReference epf = new EndpointReference(address); 
		options.setTo(epf);
		//这边是设置SESSION打开的状态(重要)
		options.setManageSession(true);
		
		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]);
	}
	
}

???执行后,结果如下: ?? true ?? admin#登陆成功 ?? 要说明的是options.setManageSession(true );是开启对Session管理的支持

(编辑:李大同)

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

    推荐文章
      热点阅读