首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Axis2 系列教程(五):單一服務會話管理詳解

     編輯:Java 相關知識

為什麼需要 Web Service 會話管理?

Web Service 本質上是無狀態的:每次方法調用相互獨立,無法保留先前調用的狀態。這對於需要登入驗證、購物車等有狀態的業務場景極為不便。Axis2 提供透明的會話管理機制,讓開發者能像使用 HttpSession 一樣在服務端保存/讀取狀態。

核心概念

  • 服務端:使用 MessageContext 與 ServiceContext 存取 Key-Value 對。
  • 配置:在 services.xml 的 <service> 元素加上 scope 屬性,可選值為 application、soapsession、transportsession、request(預設)。注意:必須全小寫。 單服務會話使用 transportsession。
  • 客戶端:調用 _serviceClient.getOptions().setManageSession(true) 啟用會話維持。

實作範例:LoginService

服務類

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

public class LoginService {
    public boolean login(String username, String password) {
        if ("bill".equals(username) && "1234".equals(password)) {
            MessageContext mc = MessageContext.getCurrentMessageContext();
            ServiceContext sc = mc.getServiceContext();
            sc.setProperty("login", "成功登錄");
            return true;
        }
        return false;
    }

    public String getLoginMsg() {
        MessageContext mc = MessageContext.getCurrentMessageContext();
        ServiceContext sc = mc.getServiceContext();
        return (String) sc.getProperty("login");
    }
}

services.xml

<service name="loginService" scope="transportsession">
    <description> 登錄服務 </description>
    <parameter name="ServiceClass"> service.LoginService </parameter>
    <messageReceivers>
        <messageReceiver mep="https://www.w3.org/2004/08/wsdl/in-out"
                         class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
    </messageReceivers>
</service>

客戶端 Stub 修改與調用

  1. 使用 wsdl2java 生成 Stub:
    %AXIS2_HOME%\bin\wsdl2java -uri https://localhost:8080/axis2/services/loginService?wsdl -p client -s -o stub
  2. 在生成的 LoginServiceStub 建構子末尾加入:
    _serviceClient.getOptions().setManageSession(true);
  3. 調用代碼:
LoginServiceStub stub = new LoginServiceStub();
LoginServiceStub.Login login = new LoginServiceStub.Login();
login.setUsername("bill");
login.setPassword("1234");

if (stub.login(login).local_return) {
    System.out.println(stub.getLoginMsg().local_return); // 輸出:成功登錄
}

Scope 值對照表

Scope 值適用場景生命週期
request無狀態調用(預設)單次請求
transportsession單一服務會話傳輸層 Session(通常由 Cookie 維持)
soapsessionSOAP 標準會話SOAP Session ID
application跨服務會話(服務群組)應用程式存活期間

C# 調用提示

單服務會話需指定 CookieContainer;跨服務會話則不需要,直接實例化不同服務的 Proxy 即可自動共享。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved