2016-12-22 148 views
0

我在CometD服務器上有SessionListener。我想在調用listener的sessionAdded()方法時將數據從客戶端傳遞到服務器。如何從CometD客戶端向CometD服務器發送參數

sessionAdded()方法接收ServerSession和ServerMessage對象。 ServerSession有一個總是看​​起來沒有任何內容的屬性映射。

我想獲得一些獨特的客戶端數據到服務器。當sessionAdded()方法被調用時,服務器應該訪問這些數據。

該文檔討論了SessionListener的基本用法,但沒有提及屬性。客戶端和服務器的所有javadoc都說它是描述setAttribute()如何設置屬性以及getAttribute()如何獲取它。

有沒有辦法做到這一點? ServerSession的屬性映射是否可以用於將屬性從客戶端傳輸到服務器,如果是這樣,如何?

有人請指教...

回答

1

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字段的示例數據。

然後,在應用程序的其他位置,可以訪問會話屬性並使用該數據。

相關問題