的ServerSession
屬性映射是一種生活在服務器上。
這是一個不透明的(從CometD的角度來看)地圖應用程序可以填充任何他們需要的。
如果要從客戶端向服務器發送數據,只需將這些附加數據放入握手消息中,然後在調用BayeuxServer.SessionListener.sessionAdded()
時從消息中檢索它。
客戶看起來是這樣的:
BayeuxClient client = ...;
Map<String, Object> extraFields = new HashMap<>();
Map<String, Object> ext = new HashMap<>();
extraFields.put(Message.EXT_FIELD, ext);
Map<String, Object> extraData = new HashMap<>();
ext.put("com.acme", extraData);
client.handshake(extraFields);
extraData.put("token", "foobar");
這將創建一個額外的數據結構,在JSON看起來是這樣的:
{
"ext": {
"com.acme": {
"token": "foobar"
}
}
}
它始終是一個非常好的做法,把下一個數據命名空間,如com.acme
,這樣你就不會搞砸CometD字段,也不會與其他可用的擴展名混淆。 將您的字段置於extraData
之內,例如上述示例中的字段token
。
然後,在服務器上:
public class MySessionListener implements BayeuxServer.SessionListener {
@Override
public void sessionAdded(ServerSession session, ServerMessage message) {
Map<String, Object> ext = message.getExt();
if (ext != null) {
Map<String, Object> extra = (Map<String, Object>)ext.get("com.acme");
if (extra != null) {
String token = (String)extra.get("token");
session.setAttribute("token", token);
}
}
}
@Override
public void sessionRemoved(ServerSession session, boolean timedout) {
}
}
此偵聽付諸會話屬性已經由客戶端發送的,在上述token
字段的示例數據。
然後,在應用程序的其他位置,可以訪問會話屬性並使用該數據。