2016-12-22 7 views
0

CometD 서버에 SessionListener가 있습니다. 리스너의 sessionAdded() 메서드가 호출 될 때 클라이언트의 데이터를 서버로 전달하려고합니다.CometD 클라이언트에서 CometD 서버로 매개 변수를 보내는 방법

sessionAdded() 메서드는 ServerSession 및 ServerMessage 개체를받습니다. ServerSession에는 항상 아무 것도없는 것으로 보이는 속성 맵이 있습니다.

고유 한 클라이언트 데이터를 서버에 보내고 싶습니다. 이 데이터는 sessionAdded() 메소드가 호출 될 때 서버에 의해 액세스되어야합니다.

문서에서는 SessionListener의 기본 사용에 대해 이야기하지만 속성에 대해서는 언급하지 않습니다. 클라이언트와 서버에 대한 모든 javadoc은 setAttribute()가 속성을 설정하는 방법과 getAttribute()가 속성을 얻는 방법을 설명하는 것이라고 말합니다.

이 방법이 있습니까? ServerSession의 속성 맵을 사용하여 클라이언트에서 서버로 속성을 전송할 수 있습니까? 그렇다면 어떻게해야합니까? 누군가가 조언을 바랍니다

... ServerSession지도 속성

답변

1

은 서버에 살고있는 맵입니다.

이것은 응용 프로그램이 필요로하는 것으로 채울 수있는 불투명 (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 필드 나 다른 확장 프로그램을 사용하지 않아도됩니다. 위의 예에서 필드 예 : 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 필드 위의 예에서, 클라이언트에 의해 전송 된 데이터를 속성.

그런 다음 응용 프로그램의 다른 곳에서 세션 속성에 액세스하여 해당 데이터를 사용할 수 있습니다.