新浪微博Web版中的私信聊天功能的几个技术细节
新浪微博Web版中的私信聊天功能的几个技术细节
蒋彪@南京
1. Pull而不是push一般在网页上要取得实时聊天数据,无外乎两种技术实现
a. 用ajax定时发起轮训, 主动的pull服务器端数据
b. 基于Flash,ActiveX,Html5等富客户端技术, 和server建立长连接,server端实时的push到客户端
新浪的实现是长轮训, 观察它的http请求,每隔一段时间网页就会发起如下的一个GET request(时间间隔不是固定的,怀疑server端做了指数推移)
(基于iframe的流pull?)
http://4.136.web0.im.weibo.com/im?jsonp=parent.org.cometd.script._callback313&message=%5B%7B%22channel%22%3A%22%2Fmeta%2Fconnect%22%2C%22connectionType%22%3A%22callback-polling%22%2C%22id%22%3A271%2C%22clientId%22%3A%22gt2psmdubshz54tl6j%22%7D%5D&1361434136747
将参数unescape之后,这个url就是
http://4.136.web0.im.weibo.com/im?jsonp=parent.org.cometd.script._callback313&message=[{"channel":"/meta/connect","connectionType":"callback-polling","id":271,"clientId":"gt2psmdubshz54tl6j"}]&1361434136747
请求的头文件Connection设置为keep-alive
,使用
http1.1
中的长连接,
并且服务器端
在没有新消息的情况下不返回
response
,造成事实上的长连接。
如果
server
端没有收到任何新消息,时间到之后,返回如下
response
<iframe id="cometd_uc" style="position: absolute; left: -100px; top: -100px; height: 1px; width: 1px; visibility: hidden; display: none;"> <html> <head><script type="text/javascript" src="http://1.126.web0.im.weibo.com/im?jsonp=parent.org.cometd.script._callback16&message=%5B%7B%22channel%22%3A%22%2Fmeta%2Fconnect%22%2C%22connectionType%22%3A%22callback-polling%22%2C%22id%22%3A18%2C%22clientId%22%3A%223y0wflmlof3hccq3u5%22%7D%5D&1361512732973" charset="utf-8">try{parent.org.cometd.script._callback16([{"id":"18","successful":true,"channel":"/meta/connect"}])}catch (ex) {} </script></head><body></body></html></iframe>
可惜的是,尝试用各种各样的XSS想拿到这个dom元素都失败了。微博在所有的输入框中都做了encode。不知道有哪位大神能发现一个可以入侵的窗口。
版本归蒋彪所有, 转载请注明出自《南湖边上的小木屋》
#以上#