我无法解释为什么存储的令牌不能用于重新部署您的应用程序(它们应该),但我可以解释为什么它们在您更改版本时不起作用。简而言之,令牌特定于应用程序版本。
首先,这样做的原因:我们希望确保发送不同数据或更改消息格式或不同版本中的任何内容的应用程序不会跨版本边界发送消息。就像您不希望 v1 中的 javascript 包针对 v2 上的 servlet 呈现一样,您也不希望 v1 的 javascript 消息处理程序接收来自 v2 servlet 的消息(反之亦然)。
因此,希望能弄清楚发生了什么:
通道由您的 appid、您的应用版本和您在调用 createChannel 或 sendMessage 时提供的 clientid 的组合来标识。Channel API 的实现不存储任何 appid/clientid -> token 的映射。为了大大简化,您可以将 createChannel 视为执行以下操作:
public String createChannel(clientid) {
// obviously we don't really just append strings to each other for actual implementation.
return encryptStringSomehow(clientid + globalAppInfo.version + globalAppInfo.appid);
}
sendMessage 是这样的:
public void sendMessage(clientid, message) {
// identify the JID used for this channel.
JID xmppJid = new JID(mutateString(clientid + globalAppInfo.version + globalAppInfo.appid),
CHANNEL_XMPP_DOMAIN); // some domain used for channel messages
// send the <message> stanza to that jid with the application message as the body
xmppService.sendMessage(xmppJid, encodeSomehow(message));
}
在客户端,负责通道的 servlet 解密令牌并绑定到由与sendMessage
函数相同的方法创建的 JID 标识的端点。
结果是令牌仅对从创建它们的同一版本的应用程序发送的消息有效。