如何从 CometD 客户端向 CometD 服务器发送参数
How to send parameters from CometD client to CometD server
我在 CometD 服务器上有一个 SessionListener。我想在调用侦听器的 sessionAdded() 方法时将数据从客户端传递到服务器。
sessionAdded() 方法接收 ServerSession 和 ServerMessage 对象。 ServerSession 有一个 Attribute 映射,似乎总是什么都没有。
我想获取一些独特的客户端数据到服务器。当调用 sessionAdded() 方法时,服务器应访问此数据。
该文档讨论了 SessionListener 的基本用法,但未提及属性。客户端和服务器的所有 javadocs 都说它是描述 setAttribute() 如何设置属性以及 getAttribute() 如何获取它。
有办法吗? ServerSession 的属性映射是否可以用于将属性从客户端传输到服务器,如果可以,如何?
有人请指教...
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
字段。
然后,您可以在应用程序的其他地方访问会话属性并使用该数据。
我在 CometD 服务器上有一个 SessionListener。我想在调用侦听器的 sessionAdded() 方法时将数据从客户端传递到服务器。
sessionAdded() 方法接收 ServerSession 和 ServerMessage 对象。 ServerSession 有一个 Attribute 映射,似乎总是什么都没有。
我想获取一些独特的客户端数据到服务器。当调用 sessionAdded() 方法时,服务器应访问此数据。
该文档讨论了 SessionListener 的基本用法,但未提及属性。客户端和服务器的所有 javadocs 都说它是描述 setAttribute() 如何设置属性以及 getAttribute() 如何获取它。
有办法吗? ServerSession 的属性映射是否可以用于将属性从客户端传输到服务器,如果可以,如何?
有人请指教...
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
字段。
然后,您可以在应用程序的其他地方访问会话属性并使用该数据。