服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

在web services中管理sessions


  在web service中通常采用两种公认技术来管理session,一种是借助http和http cookies,另一种是用soap headers。axis能帮你实现这两种技术。

  在web service中没有一种管理session的标准方法,只有两种公认的技术,一种是依靠http和http cookies,另一种,或许也是最重要的一种方法,就是用soap headers。axis能帮助开发人员实现这两种技术。
  在axis中缺省使用的是http managed sessions。在一个服务器中这么做是十分容易的,因为大多数对axis web service的管理是通过org.apache.axis.messagecontext的一个实例来完成的。在一个axis web service中你可以通过调用messagecontext类中的静态方法来得到messagecontext的一个实例:

public class sessionservice
{
public string echo(string in)
{
messagecontext mc =messagecontext.getcurrentcontext();

  messagecontext中有一个名为setmaintainsession的方法,调用它便可激活session。但在编写(axis 1.1 rc2)时,session对象只有在被访问时才能激活,如下列代码所示:

public class sessionservice
{
public string echo(string in)
{
messagecontext mc = messagecontext.
getcurrentcontext();
session session = mc.getsession();
string name = (string)session.get("name");
return in;
}
}

  这样会导致axis架构生成一个set-cookie header:set-cookie:

jsessionid=49ebbb19a1b2f8d10ee075f6f14cb8c9;
path=/axissessions

  客户端需要在cookie header中返回这个cookie来保持该session。为了使axis运行状态下的客户端能够实现这一点,就必须调用org.apache.axis.client.service接口的setmaintainsession方法。该接口是由wsdl2java生成工具所生成的locator类实现的。调用该方法之后,axis架构会自动将该cookie返回到服务器中:

public static void main(string[] args)
{
usesessionsservicelocator locator = new usesessionsservicelocator();
locator.setmaintainsession(true);

  header看起来就像这样:

cookie: jsessionid=49ebbb19a1b2f8d10ee075f6f14cb8c9

  通过http传输cookie是没有问题的,但如果客户端或服务器不通过http,或使用的是通过多个web services传入调用的multihop service,那么这种方法就不那么有效了。一种更好的方法是用soap headers来加载session id。

  axis架构支持多个handlers。通过在一个web service请求过程中调用调栈(call stack),handlers能够被放置到很多地方,它可以和传输过程结合起来,或者和一个web service一起使用。handlers可以被插入其中来处理web service请求中的请求和/或响应语句。


  axis带有一个名为org.apache.axis.handlers.simplesessionhandler的handler,它用于提供基于session管理的soap header。要使用这个简单的带有web service的session handler,你必须告知axis架构将该handler添加到handler链中。你可以通过将该handler信息添加到server-config.wsdd来实现这一点;一个简单的处理方法是定义一个包含额外配置web service所需的wsdd文件,然后用axis部署工具来部署这个配置文件。

  这个wsdd文件看起来就像这样:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/
providers/java">

<handler name="session"
type="java:org.apache.axis.handlers.
simplesessionhandler"/>

<service name="sessions" provider=
"java:rpc" style="wrapped">
<namespace>urn:kevinj:sessions</namespace>
<requestflow>
<handler type="session"/>
</requestflow>
<responseflow>
<handler type="session"/>
</responseflow>
<parameter name="classname" value=
"kevinj.usesessions"/>
<parameter name="allowedmethods" value="*"/>
</service>

</deployment>

  该handler是和service分开定义并引用的,虽然你可以在service内部定义它。注意这个handler是同时为了请求和响应而定义的;这就确保了这些headers能够在请求中被读取并添加到响应中去。你可以用这个管理工具来部署它:

java -cp [classpath to axis bits here] /
org.apache.axis.client.adminclient /
-lhttp://localhost/myservice/axisservlet
deploy.wsdd

  现在服务器就可以运行了,在使用该handler时服务器无需处理任何事情;而headers能够自动被添加进去,就像这样:

<soapenv:header>
<ns1:sessionid soapenv:actor=""
soapenv:mustunderstand="0"
xsi:type="xsd:long"
xmlns:ns1=
"http://xml.apache.org/axis/
session">
-1919645576528915916
</ns1:sessionid>
</soapenv:header>

  要使用这个header,web service客户端必须能够读取它并了解其语法;而axis客户端可以解决这个问题。

  要创建一个使用这个简单session的axis客户端,你需要配置axis客户端框架来使用该handler。过程同服务器端很相似,但不是部署到服务器,而是在本地创建config文件。你可以通过运行org.apache.axis.utils.admin来实现这一点。运行以下代码:org.apache.axis.utils.admin client deploy.wsdd

  这样就创建了一个client-config.wsdd文件,它同样也包含handler代码。

<?xml version="1.0" encoding="utf-8"?>
<deployment xmlns=
"http://xml.apache.org/axis/wsdd/"
xmlns:java= "http://xml.apache.org/axis/
wsdd/providers/java">
<globalconfiguration>
<parameter name="adminpassword"
value="admin"/>
<parameter name="attachments.implementation"
value=
"org.apache.axis.attachments.
attachmentsimpl"/>
<parameter name=
"sendmultirefs" value="true"/>
<parameter name="sendxsitypes" value=
"true"/>
<parameter name=
"sendxmldeclaration" value="true"/>
<parameter name="axis.sendminimizedelements"
value="true"/>
<requestflow>
<handler type=
"java:org.apache.axis.handlers.
simplesessionhandler"/>
</requestflow>
<responseflow>
<handler type=
"java:org.apache.axis.handlers.
simplesessionhandler"/>
</responseflow>
</globalconfiguration>
<handler name="session" type=
"java:org.apache.axis.handlers.
simplesessionhandler"/>
<service name="sessions" provider=
"java:rpc" style="wrapped" use="literal">
<requestflow>
<handler type="session"/>
</requestflow>
<responseflow>
<handler type="session"/>
</responseflow>
<parameter name="allowedmethods" value="*"/>
<parameter name="classname" value=
"kevinj.usesessions"/>
<namespace>urn:kevinj:sessions</namespace>
</service>
<transport name="java" pivot=
"java:org.apache.axis.transport.
java.javasender"/>
<transport name="http" pivot=
"java:org.apache.axis.transport.
http.httpsender"/>
<transport name="local" pivot=
"java:org.apache.axis.transport.
local.localsender"/>
</deployment>

  为了使客户端能够利用这个handler,你必须将client-config.wsdd文件添加到客户端的classpath中。然后由axis框架代表客户端来读取并响应这些headers。同样,客户端代码无需处理任何事情便可以使用它了。

扫描关注微信公众号