我無法解釋爲什麼存儲的令牌無法用於重新部署應用程序(他們應該),但我可以解釋爲什麼當您更改版本時它們不起作用。簡而言之,令牌特定於應用程序版本。
首先,原因是:我們希望確保發送不同數據或更改消息格式或不同版本的應用程序不會跨越版本邊界發送消息。同樣,您不希望從v1渲染對v2上的servlet進行JavaScript渲染,您不希望v1您的JavaScript消息處理程序從v2 servlet接收消息(反之亦然)。
所以,希望弄清楚是怎麼回事:
一個通道是由您的appid,您的應用程序版本和客戶端ID的組合,你當你調用createChannel或提供的sendMessage鑑定。 Channel API的實現不存儲任何appid/clientid - >令牌的映射。爲了極大地簡化了,你能想到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所標識的端點。
結果是令牌只對從創建它們的應用程序的相同版本發送的消息有效。
在多個選項卡中使用相同的頻道將不起作用 - 一次只能將一個客戶端連接到每個頻道。 – 2011-12-21 02:08:23