Axis单个Webservice的session管理

来源:互联网 发布:淘宝淘抢购类目群 编辑:程序博客网 时间:2024/05/16 19:32

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管理的支持



原创粉丝点击