axis2的session管理

webservice本身提倡无状态的,为支持某些需要维持状态的应用,axis2提供了session管理。
构建一个带session管理的service,需要做一下事情:
1、客户端的stub初始化需要出传入configcontext
     ConfigurationContext configContext =
ConfigurationContextFactory.createConfigurationContextFromFileSystem(base, base+File.separator+"conf"+File.separator+"axis2.xml");
     stub = new MyServiceStub(configContext);
2、客户端需要设置
     stub._getServiceClient().getOptions().setManageSession(true);
     stub是用wsdl2java工具生成的客户端调用类
3、在service发布的services.xml文件中声明session所属的范围
     <service name="foo" scope=" soapsession">
     </service>
4、服务端axis2.xml配置configcontexttimeoutinterval
     <parameter name="ConfigContextTimeoutInterval">5000</parameter>
     参数代表过期间隔
    客户端每次持有的stub(配置了context)请求后台,第一次请求时会建立session,同时记录该session的configcontext时间戳,每次该stub请求时会比对时间戳是否处于有效,若超时则标记为过期,清除,抛异常给客户端
5、服务端服务实现类实现按需要init()和destroy()方法
     init()方法是建立session创建时自动触发的
     destroy()方法是用户持过期的sessionid向后台请求时触发的,axis2不会去主动定期扫描过期session,但每次响应服务请求时去检查是否过期,当发现是过期的时候触发destroy方法,同时抛异常,该异常也会被客户端捕获


如果stub初始化时只给定endpoint,没有指定configcontext,则后台每次接受时都认为是新的session,然后每次响应请求时都将过期的session清除掉。即是说只有关联了configcontext才会真正起到预期的效果,由axis2的层次知道,当configcontext过期(timeout)时,他下面的所有context都将timeout。

每个session对应一个服务实现类的实例

默认的服务 scope为request session,即pojo模式的服务势必是request 的,每次请求后实例(服务实现类)马上被清楚

如果要使用客户端的cookies实现session,service的scope可以设置成transportsession

还有一种scope是application的,他将会随axis2的系统整个生命周期而存在

参考文章:http://www.developer.com/services/article.php/10928_3620661_2/Axis2-Session-Management.htm


猜你喜欢

转载自dingchd.iteye.com/blog/1847261