Добавить настраиваемые поля в сообщение о подписке на CometD

Я использую Java-клиент CometD на 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.


person Kaarel Purde    schedule 15.08.2017    source источник


Ответы (1)


Прежде всего, вам действительно следует обновиться, так как CometD 2.9.1 уже устарел, а JDK 7 поддерживается на Android.

Дизайн сервера, требующего наличия всех этих полей в сообщении /meta/subscribe, действительно неверен. Большая часть этой информации является статической (например, user и различные файлы cookie, такие как 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, которое будет представлять вашу компанию и приложение.

person sbordet    schedule 15.08.2017
comment
Спасибо, что указали и на другие вещи. К сожалению, я не могу обновиться. Все, что выше 2.9.1, завершится ошибкой во время рукопожатия, за исключением: exception=java.lang.NullPointerException: попытка вызвать виртуальный метод 'javax.net.ssl.SSLEngine org.eclipse.jetty.util.ssl.SslContextFactory.newSSLEngine(java. lang.String, int)' для нулевой ссылки на объект - person Kaarel Purde; 15.08.2017
comment
NullPointerException не имеет ничего общего с версиями CometD, возможно, это просто плохая конфигурация или отсутствующие вызовы методов start() для запуска жизненного цикла этих объектов Jetty. - person sbordet; 15.08.2017