Xmpp學(xué)習(xí)之Smack發(fā)送消息JID變亂碼

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載最域。

轉(zhuǎn)載請(qǐng)表明出處:http://www.reibang.com/p/9230b8217d07

快速導(dǎo)航,簡(jiǎn)單來(lái)個(gè)目錄圖片。

圖片
圖片

前言

上一篇博客Android平臺(tái)使用Smack后锈麸,這次咱們來(lái)分享一下在集成過(guò)程中SASL認(rèn)證的一些坑=_=镀脂。

在此為后面的smack學(xué)習(xí)做筆記,以作備忘忘伞。
以下是本次采用的Demo環(huán)境:

  • Openfire 3.8.2
  • smack 4.2.1

登錄成功后發(fā)現(xiàn)jid變成 亂碼@亂碼

一般發(fā)生這種問(wèn)題薄翅,在登錄時(shí)是沒(méi)問(wèn)題的,但是當(dāng)你想發(fā)送消息時(shí)氓奈,你會(huì)發(fā)現(xiàn)接收消息方的名字居然是亂碼翘魄,下面我來(lái)說(shuō)一下為什么會(huì)登錄成功,但是發(fā)送消息亂碼舀奶。

解決方案

解決方案很簡(jiǎn)單暑竟,僅需在調(diào)用connection.Login()函數(shù)前先調(diào)用SASLAuthentication.blacklistSASLMechanism("ANONYMOUS");,把ANONYMOUS加入黑名單即可育勺,下面討論一下為什么會(huì)發(fā)生這種情況但荤。

如何證實(shí)

如何證實(shí)呢?咱們來(lái)看一下連接socket后的第二條報(bào)文:

<?xml version='1.0' encoding='UTF-8'?>
    <stream:stream xmlns:stream="http://etherx.jabber.org/streams" 
    xmlns="jabber:client" from="im" 
    id="e26ece26" 
    xml:lang="en" 
    version="1.0">
    <stream:features>
        <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls">
        </starttls>
        <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
            <mechanism>PLAIN</mechanism>
            <mechanism>ANONYMOUS</mechanism>
            <mechanism>JIVE-SHAREDSECRET</mechanism>
        </mechanisms>
        <compression xmlns="http://jabber.org/features/compress">
            <method>zlib</method>
        </compression>
        <auth xmlns="http://jabber.org/features/iq-auth"/>
        <register xmlns="http://jabber.org/features/iq-register"/>
    </stream:features>

從上面的報(bào)文可以看到服務(wù)器支持的 SASL 認(rèn)證機(jī)制只有三種(你們的服務(wù)器不一定和我返回的認(rèn)證機(jī)制一樣涧至,這里只是打個(gè)比方)腹躁,但是當(dāng)你想設(shè)置PLAIN認(rèn)證方式時(shí),你會(huì)在API中發(fā)現(xiàn)居然沒(méi)有設(shè)置唯一認(rèn)證方式化借,且無(wú)法設(shè)置優(yōu)先級(jí)潜慎,因?yàn)?code>ANONYMOUS的排序比PLAIN的順序前,所以SDK直接返回了ANONYMOUS,下面來(lái)看一下SASLAuthentication的Sasl認(rèn)證是怎么做的:

Iterator<SASLMechanism> it = REGISTERED_MECHANISMS.iterator();
final List<String> serverMechanisms = getServerMechanisms();
       铐炫、垒手、、
// Iterate in SASL Priority order over registered mechanisms
while (it.hasNext()) {
    SASLMechanism mechanism = it.next();
    String mechanismName = mechanism.getName();
            倒信、科贬、、
            鳖悠、榜掌、、
    if (serverMechanisms.contains(mechanismName)) {
        /* Create a new instance of the SASLMechanism 
        for every authentication attempt.
        return*/
         mechanism.instanceForAuthentication(connection, 
        configuration);
    }

通過(guò)以上源碼咱們發(fā)現(xiàn)乘综,無(wú)非就是String.contains()函數(shù)進(jìn)行匹配字符串憎账,那么問(wèn)題來(lái)了,如果ANONYMOUS的排序比PLAIN的順序前卡辰,則直接返回ANONYMOUS胞皱,怎么看到系統(tǒng)的SASLMechanism排序呢?咱們?cè)賮?lái)看下面的log:

W/System.err: org.jivesoftware.smack.SmackException: 
No supported and enabled SASL Mechanism provided by server. 
Server announced mechanisms: 
[PLAIN, ANONYMOUS, JIVE-SHAREDSECRET].
 Registerd SASL mechanisms with Smack: [
    SASL Mech: 
        SCRAM-SHA-1-PLUS, Prio: 100, 
        SASL Mech: SCRAM-SHA-1, Prio: 110, 
        SASL Mech: DIGEST-MD5, Prio: 210, 
        SASL Mech: PLAIN, Prio: 410, 
        SASL Mech: X-OAUTH2, Prio: 410, 
        SASL Mech: ANONYMOUS, Prio: 500, 
        SASL Mech: EXTERNAL, Prio: 510
]. Enabled SASL mechansisms for this connection: [PLAIN]. 
Blacklisted SASL mechanisms: [PLAIN, SCRAM-SHA-1-PLUS].

相信大家看到上面的log已經(jīng)發(fā)現(xiàn)問(wèn)題所在了九妈,Prio是優(yōu)先級(jí)反砌,ANONYMOUS的優(yōu)先級(jí)明顯高于PLAINDIGEST-MD5萌朱、X-OAUTH2等宴树。

小知識(shí)

ANONYMOUS級(jí)別官方解釋是,匿名登錄晶疼,所以產(chǎn)生的JID是隨機(jī)生成的酒贬。

結(jié)尾

本篇博客簡(jiǎn)單描述了如何解決SASL認(rèn)證的一個(gè)小坑,歡迎支持冒晰。

引用

最新的smack接入指南鏈接:https://download.igniterealtime.org/smack/docs/latest/documentation/gettingstarted.html/

最新版smack JavaDoc鏈接:https://download.igniterealtime.org/smack/docs/latest/javadoc/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末同衣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子壶运,更是在濱河造成了極大的恐慌耐齐,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒋情,死亡現(xiàn)場(chǎng)離奇詭異埠况,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)棵癣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)辕翰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人狈谊,你說(shuō)我怎么就攤上這事喜命」瞪常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵壁榕,是天一觀的道長(zhǎng)矛紫。 經(jīng)常有香客問(wèn)我,道長(zhǎng)牌里,這世上最難降的妖魔是什么颊咬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮牡辽,結(jié)果婚禮上喳篇,老公的妹妹穿的比我還像新娘。我一直安慰自己态辛,他們只是感情好麸澜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著因妙,像睡著了一般痰憎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攀涵,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音洽沟,去河邊找鬼以故。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裆操,可吹牛的內(nèi)容都是我干的怒详。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼踪区,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昆烁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缎岗,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤静尼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后传泊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鼠渺,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年眷细,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拦盹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溪椎,死狀恐怖普舆,靈堂內(nèi)的尸體忽然破棺而出恬口,到底是詐尸還是另有隱情,我是刑警寧澤沼侣,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布楷兽,位于F島的核電站,受9級(jí)特大地震影響华临,放射性物質(zhì)發(fā)生泄漏芯杀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一雅潭、第九天 我趴在偏房一處隱蔽的房頂上張望揭厚。 院中可真熱鬧,春花似錦扶供、人聲如沸筛圆。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)太援。三九已至,卻和暖如春扳碍,著一層夾襖步出監(jiān)牢的瞬間提岔,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工笋敞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碱蒙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓夯巷,卻偏偏與公主長(zhǎng)得像赛惩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子趁餐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理喷兼,服務(wù)發(fā)現(xiàn),斷路器后雷,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 版權(quán)聲明:本文為博主原創(chuàng)文章季惯,未經(jīng)博主允許不得轉(zhuǎn)載。轉(zhuǎn)載請(qǐng)表明出處:http://www.reibang.com/...
    Cavalier123閱讀 3,099評(píng)論 0 12
  • 一喷面、Smack庫(kù)概述 ????Smack是一個(gè)開(kāi)源星瘾、易用的XMPP/Jabber客戶(hù)端庫(kù),它使用Java語(yǔ)言開(kāi)發(fā)惧辈,...
    AndryYu閱讀 6,102評(píng)論 2 13
  • 關(guān)于XMPP最權(quán)威的講解:http://www.jabbercn.org/RFC3920(這個(gè)才是最權(quán)威的琳状,下面文...
    隨風(fēng)飄蕩的小逗逼閱讀 1,487評(píng)論 1 5
  • 今日話(huà)題:咪蒙的文章《說(shuō)來(lái)慚愧念逞,我的助理月薪才5萬(wàn)》 黃小污:超出預(yù)期 安迪:情緒調(diào)節(jié) 先列出來(lái)困食,以免我忘記了。 ...
    時(shí)光蜜糖閱讀 453評(píng)論 0 50