Web Service 本質上是無狀態的:每次方法調用相互獨立,無法保留先前調用的狀態。這對於需要登入驗證、購物車等有狀態的業務場景極為不便。Axis2 提供透明的會話管理機制,讓開發者能像使用 HttpSession 一樣在服務端保存/讀取狀態。
MessageContext 與 ServiceContext 存取 Key-Value 對。services.xml 的 <service> 元素加上 scope 屬性,可選值為 application、soapsession、transportsession、request(預設)。注意:必須全小寫。 單服務會話使用 transportsession。_serviceClient.getOptions().setManageSession(true) 啟用會話維持。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");
}
}
<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>
wsdl2java 生成 Stub:%AXIS2_HOME%\bin\wsdl2java -uri https://localhost:8080/axis2/services/loginService?wsdl -p client -s -o stubLoginServiceStub 建構子末尾加入:_serviceClient.getOptions().setManageSession(true);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 值 | 適用場景 | 生命週期 |
|---|---|---|
| request | 無狀態調用(預設) | 單次請求 |
| transportsession | 單一服務會話 | 傳輸層 Session(通常由 Cookie 維持) |
| soapsession | SOAP 標準會話 | SOAP Session ID |
| application | 跨服務會話(服務群組) | 應用程式存活期間 |
單服務會話需指定 CookieContainer;跨服務會話則不需要,直接實例化不同服務的 Proxy 即可自動共享。