Spark的登录:LoginDialog.login()方法
1. 生成一个SessionManager
2. 生成一个XMPPConnection对象
3. 然后用XMPPConnection建立连接并初始化:生成socket,并建好它的reader/writer
4. 然后调用XMPPConnection.login()方法,为了简化,先把SASL抛一边,看看smack怎么用NonSASLAuthentication来做认证
5. 会对密码作digest,避免直接传password. 作digest时会用connectionId当盐
6. 发出认证请求,服务端返回用户名
7. 最后把服务端返回的用户名更新到connection.user中, 设置connection.authenticated = true, anonymous = false
再来看看spark如何使用身份信息,以 Roster.reload()为例(刷新好友列表)
1. packetWriter.sendPacket(packet)发出packet,packet里面不会掺杂用户身份信息。
2. 服务端收到消息后,其中一步是在ClientStanzaHandler.processMessage()中执行 packet.setFrom(session.getAddress()),把身份消息塞入Packet
引用
<iq id="psg6P-8" type="get" from="kent@someServer/Spark 2.6.3">
<query xmlns="jabber:iq:roster"/>
</iq>
也就是说服务端直接把用户的身份信息放在服务端的mina session对象里,要用时再从session里把用户信息取出来