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 ");
- }
- }
/**
* 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是无法存放信息。
编码如下:
- <servicename="loginService"scope="transportsession">
- <description>
- description
- </description>
- <!-- 这个应该是参数和返回值信息的解析类,in-only是输入也就是参数,in-out是输出也就是返回值。 -->
- <parametername="ServiceClass">server.perfect.LoginService</parameter>
- <messageReceivers>
- <messageReceivermep="http://www.w3.org/2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
- <messageReceivermep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
- </messageReceivers>
- </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. 进行客户端的编写
- 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 staticvoid 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]);
- }
- }
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管理的支持