首页 文章

将自定义字段添加到CometD订阅消息

提问于
浏览
1

我在Android上使用CometD Java客户端 .

compile group:'org.cometd.java',name:'cometd-java-client',version:'2.9.1'

我需要订阅CometD服务器上的 Channels . 但是存在一个问题 - 服务器需要自定义订阅消息(这是来自服务器文档的预期订阅消息有效负载):

[
    {
        "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 ,_ 273741pidsid 等)?目前我正在订阅这样的 Channels :

cometdClient.getChannel("/chat/" + clientID).subscribe(new ChannelListener("/chat/ messages"), new ChannelListener("/chat/ progress"));

但它正如预期的那样失败 .

顺便说一句,我使用 org.eclipse.jetty.client.HttpClient 作为HttpClient .

1 回答

  • 1

    首先,你应该真正升级,因为CometD 2.9.1现在已经很老了,Android上支持JDK 7 .

    需要 /meta/subscribe 消息中所有这些字段的服务器的设计确实是错误的 . 大多数信息是静态的(例如 user 和各种"cookies",例如 pid 等),并且可以在CometD握手时确定,因此在订阅期间无需发送信息 .

    此外,在 /meta/subscribe 消息期间发送它会使其受到攻击(例如,攻击者可以伪造具有不同 user 字段的消息) . 您想要阅读CometD documentationsecurity section .

    此外,使用每个用户的通道(因为看起来通道名称是 /chat/user 字段的串联)不是推荐的方法,因为它可能会创建很多通道,而相同的功能可以实现更多有效地使用单个服务通道(并且 user 作为正在发送的消息的字段) .

    如果你真的必须将这些字段添加到 /meta/subscribe 消息中,那么这样做的方法是使用custom extension,沿着这些方向:

    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",
                ...
            }
        }
    }
    

    请注意额外字段如何不污染消息本身,但是在名称空间 com.acme.app 下的 ext 字段中分组,这将代表您的公司和应用程序 .

相关问题