Axis单个Webservice的session管理
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管理的支持 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |