2016-12-22 9 views
0

私はCometDサーバにSessionListenerを持っています。リスナーのsessionAdded()メソッドが呼び出されたときに、クライアントからサーバーにデータを渡したいとします。CometDクライアントからCometDサーバにパラメータを送る方法

sessionAdded()メソッドは、ServerSessionオブジェクトとServerMessageオブジェクトを受け取ります。 ServerSessionには、常にそれに何もないように見える属性マップがあります。

私はいくつかの一意のクライアントデータをサーバーに取得したいと考えています。このデータは、sessionAdded()メソッドが呼び出されたときにサーバーによってアクセスされる必要があります。

このドキュメントでは、SessionListenerの基本的な使用について説明していますが、属性については何も言及していません。クライアントとサーバー用のjavadocはすべて、setAttribute()が属性を設定する方法と、getAttribute()がその属性を取得する方法を記述することです。

これを行う方法はありますか? ServerSessionの属性マップを使用してクライアントからサーバーに属性を転送できますか?

誰かServerSession属性マップは、サーバー上に住んでいるマップです...

答えて

1

をアドバイスしてください。

これは、アプリケーションが必要なものを入力できる不透明(CometDの観点から)マップです。

クライアントからサーバーにデータを送信する場合は、この追加データをハンドシェイクメッセージに入れて、BayeuxServer.SessionListener.sessionAdded()が呼び出されたときにメッセージからデータを取得することができます。

クライアントは次のようになります。常に下にデータを置くために非常に良い方法です

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

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で次のようになり、余分なデータ構造を作成しますcom.acmeなどの名前空間を使用しているため、CometDフィールドや他の拡張機能と混同しないようにしてください。 上記の例のフィールドtokenのように、フィールドをextraDataの内側に置きます。

その後、サーバー上:

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フィールド上の例では、クライアントから送信されてきたセッション属性データになります。

次に、アプリケーションの他の場所で、セッション属性にアクセスしてそのデータを使用できます。

関連する問題