Добавьте настраиваемые поля в сообщение подписки CometD
Я использую клиент CometD Java на Android.
группа компиляции: 'org.cometd.java', имя: 'cometd-java-client', версия: '2.9.1'
Мне нужно подписаться на канал на сервере CometD. Но есть проблема - серверу требуется настраиваемое сообщение подписки (это ожидаемая полезная нагрузка сообщения подписки из документации сервера):
[
{
"user": "xyz-WQUAq3shWho1ZcJHaibQYzCh2ILMMX1o-gA6NuehTFYMhvViv6Ow3dvPbyt8Zwg10-bd8bd779f107615b1c5a1470706e4050e5389ddc",
"domain": "xyz",
"pid": "gA6NuehTFYMhvViv6Ow3dvPbyt8Zwg10",
"sid": "85f103a2",
"gid": "WQUAq3shWho1ZcJHaibQYzCh2ILMMX1o",
"pageId": "6ea23e",
"entityId": "xyz",
"triggeringGoal": "3E955818355C44E2479B2A26629E69566C8C6376",
"chatSearchPattern": "ua.domain=xyz",
"startTime": 1482931626853,
"metadata": "{}",
"chatMetadata": "{}",
"language": "en",
"id": "3",
"channel": "\/meta\/subscribe",
"subscription": "\/chat\/xyz-WQUAq3shWho1ZcJHaibQYzCh2ILMMX1o-gA6NuehTFYMhvViv6Ow3dvPbyt8Zwg10-bd8bd779f107615b1c5a1470706e4050e5389ddc",
"clientId": "26l1v2ngpdcwdtno1wu30rk92dur4",
"ext": {
}
}
]
Поэтому мой вопрос заключается в том, как добавить пользовательские поля в сообщение подписки (user
, domain
, pid
, sid
так далее)? В настоящее время я подписываюсь на такие каналы:
cometdClient.getChannel("/chat/" + clientID).subscribe(new ChannelListener("/chat/ messages"), new ChannelListener("/chat/ progress"));
Но это не так, как ожидалось.
Кстати, я использую org.eclipse.jetty.client.HttpClient
как HttpClient.
1 ответ
Прежде всего, вы должны действительно обновить систему, так как CometD 2.9.1 действительно устарел, а JDK 7 поддерживается на Android.
Дизайн сервера, требующий все эти поля в /meta/subscribe
сообщение действительно неправильно. Большая часть этой информации является статической (например, user
и различные "куки", такие как pid
и т. д.) и может быть определено во время квитирования CometD, поэтому нет необходимости отправлять его во время подписки.
Кроме того, отправив его во время /meta/subscribe
сообщение делает его подверженным атакам (злоумышленник может подделать сообщение с другим user
поле, например). Вы хотите прочитать раздел о безопасности документации CometD.
Кроме того, использование канала для каждого пользователя (так как кажется, что имя канала является объединением /chat/
и user
поле) не является рекомендуемым подходом, поскольку он может создать, возможно, много каналов, в то время как та же функциональность может быть достигнута гораздо более эффективно с помощью одного канала обслуживания (и user
как поле отправляемых сообщений).
Если вам действительно нужно добавить эти поля в /meta/subscribe
сообщение, способ сделать это состоит в том, чтобы использовать пользовательское расширение, по следующим направлениям:
class SubscribeExtension extends ClientSession.Extension.Adapter {
@Override
public boolean sendMeta(ClientSession session, Message.Mutable message) {
if (Channel.META_SUBSCRIBE.equals(message.getChannel())) {
String subscription = (String)message.get(Message.SUBSCRIPTION_FIELD);
if (subscription.startsWith("/chat/") {
// Add fields.
}
}
return true;
}
}
Наконец, если вам действительно нужно добавить дополнительные поля в /meta/subscribe
сообщение, вы хотите сделать это внутри ext
поле с правильным пространством имен:
{
"id": "3",
"channel": "/meta/subscribe",
"subscription": "/chat/xyz-WQUAq3shWho1ZcJHaibQYzCh2ILMMX1o-gA6NuehTFYMhvViv6Ow3dvPbyt8Zwg10-bd8bd779f107615b1c5a1470706e4050e5389ddc",
"clientId": "26l1v2ngpdcwdtno1wu30rk92dur4",
"ext": {
"com.acme.myapp": {
"time": 1234567890,
"pageId": "6ea23e",
...
}
}
}
Обратите внимание, что дополнительные поля не загрязняют само сообщение, а сгруппированы в ext
поле под пространством имен com.acme.app
который будет представлять вашу компанию и приложение.