使用Axis2實現Web Service的用戶會話

    對於需要進行用戶認證的應用來說,需要Web Service具有會話的功能,用戶在使用Web Service時需要進行登錄。Axis2提供了4種會話類型,可以很容易的實現會話管理。
    作爲一個demo,本文模擬用戶通過Web Service登錄進系統,然後進行業務操作,最後退出登錄。本文假設用戶的業務操作是跨服務的,而Axis2的Transport Session實現了跨服務的會話管理,也是本文所使用的會話類型。
    用戶登錄的服務:
package demo.axis2;

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

public class User
{
    /**
     * 用戶登錄
     * @param userName
     * @param password
     * @return
     */
    public boolean login(String userName, String password)
    {
        MessageContext mc = MessageContext.getCurrentMessageContext();
        ServiceGroupContext sgc = mc.getServiceGroupContext();
        sgc.setProperty("userName", userName);
        
        return true;
    }
    
    /**
     * 用戶退出登錄
     * @return
     */
    public String logout()
    {
        MessageContext mc = MessageContext.getCurrentMessageContext();
        ServiceGroupContext sgc = mc.getServiceGroupContext();
        if (sgc!= null && sgc.getProperty("userName") != null)
        {
            String userName = sgc.getProperty("userName").toString();
            sgc.setProperty("userName", null);
            return  userName + "退出登錄";
        }
        return "未登錄";
    }
}
    業務操作的服務:
package demo.axis2;

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

public class Biz
{
    /**
     * 模擬業務操作
     * @return
     */
    public String doBiz()
    {
        MessageContext mc = MessageContext.getCurrentMessageContext();
        ServiceGroupContext sgc =  mc.getServiceGroupContext();
        if (sgc==null || sgc.getProperty("userName") == null) return "未登錄,不能進行業務操作";
        else return "業務操作成功。操作員:" + sgc.getProperty("userName");
    }
}
    services.xml:
<serviceGroup>
    <service name="User" scope="transportsession">
      <Description>
        用戶登錄服務
      </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" locked="false">demo.axis2.User</parameter>
    </service>
    <service name="Biz" scope="transportsession">
        <Description>
          業務服務
        </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" locked="false">demo.axis2.Biz</parameter>
    </service>
</serviceGroup>
    客戶端訪問時,需要加一句“options.setManageSession(true);”,其他的地方都是相同的。客戶端示例代碼如下:
package demo.axis2.client;

import javax.xml.namespace.QName;

import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class UserClient
{
    public static void main(String[] args) throws Exception
    {
        // 使用RPC方式調用WebService        
        RPCServiceClient serviceClient = new RPCServiceClient();
        Options options = serviceClient.getOptions();
        
        /* 用戶登錄 */
        // 指定調用WebService的URL
        EndpointReference targetEPR = new EndpointReference(
                "http://localhost:8080/Axis2ServerDemo/services/User");
        options.setTo(targetEPR);
        options.setManageSession(true);
        // 指定方法的參數值
        Object[] opAddEntryArgs = new Object[] {"tom", "pwd"};
        // 指定方法返回值的數據類型的Class對象
        Class[] classes = new Class[] {Boolean.class};
        // 指定要調用的getGreeting方法及WSDL文件的命名空間
        QName opAddEntry = new QName("http://axis2.demo", "login");
        // 調用方法並輸出該方法的返回值
        System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
        
        /* 業務操作 */
        EndpointReference targetEPR1 = new EndpointReference(
           "http://localhost:8080/Axis2ServerDemo/services/Biz");
        options.setTo(targetEPR1);
        Object[] opAddEntryArgs1 = new Object[] {};
        Class[] classes1 = new Class[] {String.class};
        QName opAddEntry1 = new QName("http://axis2.demo", "doBiz");
        System.out.println(serviceClient.invokeBlocking(opAddEntry1, opAddEntryArgs1, classes1)[0]);
        
        /* 用戶退出登錄 */
        options.setTo(targetEPR);
        Object[] opAddEntryArgs2 = new Object[] {};
        Class[] classes2 = new Class[] {String.class};
        QName opAddEntry2 = new QName("http://axis2.demo", "logout");
        System.out.println(serviceClient.invokeBlocking(opAddEntry2, opAddEntryArgs2, classes2)[0]);
    }
}
    如果客戶端是用工具生成的代碼,找到相應的地方進行修改。
    執行上面的客戶端代碼,就可以看到結果了。
    這個簡單的demo實現了一個簡單的Web Service的用戶會話,在這個基礎上可以開發出符合自己需求的功能。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章