top
Loading...
在WebServices中管理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請求中的請求和/或響應語句。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗