五、WebService会话Session的管理

33 篇文章 0 订阅
33 篇文章 9 订阅

1、新建Session的WebService测试代码,代码很简单。就是记录用户登录的状态信息,放在MessageContext的ServiceContext中。代码如下:

package
 com.hoo.service;

import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceContext;

/**
* function:WebService Session会话消息
* @author hoojo
* @createDate 2011-3-8 下午04:11:27
* @file LoginService.java
* @package com.hoo.service
* @project Axis2WebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/

public class LoginService {
public boolean login(String userName, String password) {
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、使用axis2的工具生成aar文件,并发布LoginService服务。

clip_image002

关于这里发布LoginService的步骤就不一一介绍,上面已经有说过了。当你用这个步骤发布WebService的时候,

你可以打开压缩文件的方式aar文件(其实不一定要用aar文件,只是官方推荐的aar,jar文件也是可以的),

在META-INF目录下有一个services.xml文件,看到它的这个标签,没有设置scope属性。

clip_image004

scope默认的是request,我们得修改services.xml的内容。

修改后services.xml内容如下:

这个地方的scope是关键,如果这里不设置的话session是无法存放信息。
<
service
 name
="LoginService"
 scope
="transportsession"
>

< description >
Please Type your service description here
</ description >
< 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 >
< parameter name ="ServiceClass" > com.hoo.service.LoginService</ parameter >
</ service >

3 、用控制台Dos命令发布WebService


这个是手工打包,也就是我们经常用的jar命令


首先我们得需要一个services.xml文件,文件内容如上面的。


<service name="LoginService" scope="transportsession">


name是当前发布WebService的名称,scope是会话作用域。保存在Session中就要用这个transportsession这个作用域。

<parameter name="ServiceClass">com.hoo.service.LoginService</parameter>

这个是当前Service的类路径,包名+类名

<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>

 


这个应该是参数和返回值信息的解析类,in-only是输入也就是参数,in-out是输出也就是返回值。


A、 首先,我们在C盘下新建一个sessionService的目录,然后将上面的services.xml文件中的ServiceClass的类的class文件

copy到这个目录下,注意要带上package目录,然后在sessionService目录下新建一个META-INF将上面的services.xml文件放到这个目录下

 

B、 然后运行cmd进入控制台,进入sessionService这个目录,键入命令如下:


jar cvf service.aar .


clip_image006


service.aar是打包后的文件名称,.是指代当前目录


如果你不懂jar命令,你可以输入jar会有命令语法的提示


clip_image008


进入sessionService这个目录中,你可以看到service.aar文件就有了。然后将这个文件copy到axis2的WEB-INF目录下的services目录中,也就是


[tomcat-home]/webapps/axis2/WEB-INF/services


然后可以通过:http://localhost:8080/axis2/services/listServices


就可以查看刚才发布的服务了。


这样就完成手工发布打包发布WebService了


C、 编写WebService客户端的请求代码

package
 com.hoo.service;

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;

/**
* function:LoginService Session客户端代码
* @author hoojo
* @createDate 2011-3-9 上午11:21:59
* @file LoginServiceClient.java
* @package com.hoo.service
* @project Axis2WebService
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/

public class LoginServiceClient {

public static void main(String[] args) throws AxisFault {
String target = "http://localhost:8080/axis2/services/LoginService ";
//target = "http://localhost:8080/axis2/services/MyLoginService";
RPCServiceClient client = new RPCServiceClient();
Options options = client.getOptions();
options.setManageSession(true );

EndpointReference epr = new EndpointReference(target);
options.setTo(epr);

QName qname = new QName("http://service.hoo.com ", "login ");
//指定调用的方法和传递参数数据,及设置返回值的类型
Object[] result = client.invokeBlocking(qname, new Object[] { "admin ", "123456 " }, new Class[] { boolean .class });
System.out.println(result[0]);

qname = new QName("http://service.hoo.com ", "getLoginMessage ");
result = client.invokeBlocking(qname, new Object[] { null }, new Class[] { String.class });
System.out.println(result[0]);
}
}

执行后,结果如下:

true

admin#登陆成功

上面要说明的是options.setManageSession(true );是开启对Session管理的支持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值