Axis单个Webservice的session管理

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

     

  1. /**
  2. * WebService Session会话消息
  3. * @author linwei
  4. *
  5. */ 
  6. public class LoginService { 
  7.  
  8.     public boolean login(String userName, String password) { 
  9.         //通过MessageContext来进行session的管理 
  10.         MessageContext context = MessageContext.getCurrentMessageContext(); 
  11.         ServiceContext ctx = context.getServiceContext(); 
  12.         if ("admin ".equals(userName) &&"123456 ".equals(password)) { 
  13.             ctx.setProperty("userName ", userName); 
  14.             ctx.setProperty("password ", password); 
  15.             ctx.setProperty("msg ","登陆成功 "); 
  16.             return true
  17.         } 
  18.         ctx.setProperty("msg ", "登陆失败 "); 
  19.         return false
  20.     } 
  21.  
  22.     public String getLoginMessage() { 
  23.         MessageContext context = MessageContext.getCurrentMessageContext(); 
  24.         ServiceContext ctx = context.getServiceContext(); 
  25.         return ctx.getProperty("userName ") +"# " + ctx.getProperty("msg "); 
  26.     } 
  27.  
/**
 * 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是无法存放信息。

  编码如下:

  1. <servicename="loginService"scope="transportsession"> 
  2.     <description> 
  3.          description 
  4.     </description> 
  5.     <!-- 这个应该是参数和返回值信息的解析类,in-only是输入也就是参数,in-out是输出也就是返回值。 --> 
  6.     <parametername="ServiceClass">server.perfect.LoginService</parameter> 
  7.     <messageReceivers> 
  8.         <messageReceivermep="http://www.w3.org/2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/> 
  9.         <messageReceivermep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> 
  10.     </messageReceivers> 
  11. </service> 
<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.  进行客户端的编写

 

  1. package client; 
  2.  
  3. import javax.xml.namespace.QName; 
  4.  
  5. import org.apache.axis2.AxisFault; 
  6. import org.apache.axis2.addressing.EndpointReference; 
  7. import org.apache.axis2.client.Options; 
  8. import org.apache.axis2.rpc.client.RPCServiceClient; 
  9.  
  10. public class LoginServiceTest { 
  11.  
  12.     public staticvoid main(String[] args) throws AxisFault { 
  13.          
  14.         //RPCServiceClient是RPC方式调用 
  15.         RPCServiceClient client = new RPCServiceClient(); 
  16.         Options options = client.getOptions();  
  17.         //设置调用WebService的URL  
  18.         String address = "http://localhost:8080/axis2/services/loginService"
  19.         EndpointReference epf = new EndpointReference(address);  
  20.         options.setTo(epf); 
  21.         //这边是设置SESSION打开的状态(重要) 
  22.         options.setManageSession(true); 
  23.          
  24.         QName qname = new QName("http://perfect.server","login"); 
  25.         //指定调用的方法和传递参数数据,及设置返回值的类型  
  26.         Object[] result = client.invokeBlocking(qname, new Object[] { "admin ", "123456 " }, new Class[] {boolean .class }); 
  27.         System.out.println(result[0]); 
  28.  
  29.         qname = new QName("http://perfect.server","getLoginMessage"); 
  30.         result = client.invokeBlocking(qname, new Object[] {null }, new Class[] { String.class }); 
  31.         System.out.println(result[0]); 
  32.     } 
  33.      
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管理的支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值