2016-12-22 4 views
0

Ich habe einen SessionListener auf einem CometD-Server. Ich möchte Daten von einem Client an den Server übergeben, wenn die sessionAdded() -Methode des Listeners aufgerufen wird.So senden Sie Parameter vom CometD-Client zum CometD-Server

Die Methode sessionAdded() empfängt ein ServerSession- und ServerMessage-Objekt. ServerSession hat eine Attributzuordnung, die scheinbar immer nichts enthält.

Ich möchte einige eindeutige Client-Daten auf dem Server erhalten. Auf diese Daten sollte vom Server zugegriffen werden, wenn die sessionAdded() -Methode aufgerufen wird.

Die Dokumentation spricht über die grundlegende Verwendung eines SessionListener, sagt aber nichts über Attribute. Alle Javadocs für Client und Server sagen, dass es beschreibt, wie setAttribute() ein Attribut setzt und wie getAttribute() es bekommt.

Gibt es eine Möglichkeit, dies zu tun? Kann die ServerSession-Attributzuordnung verwendet werden, um Attribute vom Client zum Server zu übertragen, und wenn ja, wie?

Jemand bitte raten ...

Antwort

1

Die ServerSession Karte Attribute ist eine Karte, die auf dem Server lebt.

Es ist eine undurchsichtige (aus der Sicht von CometD) Karte, dass Anwendungen mit allem, was sie brauchen, bevölkern können.

Wenn Sie Daten von einem Client an den Server senden möchten, können Sie diese zusätzlichen Daten einfach in die Handshake-Nachricht einfügen und sie dann aus der Nachricht abrufen, wenn BayeuxServer.SessionListener.sessionAdded() aufgerufen wird.

Der Kunde sieht wie folgt aus:

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"); 

Dies schafft eine zusätzliche Datenstruktur, die wie folgt in JSON aussieht:

{ 
    "ext": { 
    "com.acme": { 
     "token": "foobar" 
    } 
    } 
} 

Es ist immer eine sehr gute Praxis, um Ihre Daten unter a zu setzen Namespace wie com.acme, damit Sie nicht mit CometD-Feldern oder mit anderen Erweiterungen, die Sie verwenden können, Probleme haben. Setzen Sie Ihre Felder innerhalb extraData, wie zum Beispiel Feld token im obigen Beispiel.

Dann auf dem Server:

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) { 
    } 
} 

Dieser Zuhörer in die Sitzung legt Attribute Daten, die vom Client gesendet wurden, im Beispiel über das token Feld.

Dann können Sie an anderer Stelle in der Anwendung auf die Sitzungsattribute zugreifen und diese Daten verwenden.

Verwandte Themen