我有一种情况,其中我想告诉我的网站的用户已经有人评论的一篇文章上,他们还评论说。 这是很多像这样的通知我当有人回应问题的方式!
服务器端,我坚持了注释,再看看谁在相同的评论文章的所有用户。 然后我播(我使用的气氛):
PushContext pushContext = PushContextFactory.getDefault().getPushContext();
for(User u : users){
// channel name, message
pushContext.push("/user_" + u.id, "someone commented! blah blah");
}
“频道”我要广播是用户的“自己”的通道,因为我不希望每个用户收到此类通知。 我用的是用户的ID频道名来实现这一点。
这是做保证只有相关的用户得到通知的正确方法?
我想我也希望做两两件事:
- 只有推给谁,我相信仍然是在线用户。 如果他们不在线,那么它的资源推送到他们的浪费。
- 加密信息,否则任何人都可以听我的消息,如果他们知道我的用户ID。
还有什么我需要考虑的?
SO使用的WebSockets,例如,当一个评论是在这个帖子发,你在SO页面的左上方得到您的状态栏的通知。
当加载页面时,浏览器发出的协议升级请求,看起来像这样:
Request URL:ws://sockets-se.or.stackexchange.com/
Request Method:GET
Status Code:101 Switching Protocols
Request Headersview source
Connection:Upgrade
Cookie:__qca=P0-1697817643-1763440830313; __utma=27376923.959753990.1338240830.1353943751.1384115154.33; __utmc=27693525; __utmz=27699983.1356175156.31.31.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)
Host:sockets-se.or.stackexchange.com
Origin:http://stackoverflow.com
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Sec-WebSocket-Key:6qFl45+6gZ526yMMo79zWQ==
Sec-WebSocket-Version:13
Upgrade:websocket
(Key3):00:00:00:00:00:00:00:00
Response Headersview source
Connection:Upgrade
Sec-WebSocket-Accept:B4h2G+gi78iNZZXg+o6iAztgF1I=
Upgrade:websocket
(Challenge Response):00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
该插座再打开,并且服务器可以将更新发送到浏览器。 例如,我的意见的通知是由浏览器所接收:
{"action":"1-question-12993099","data":"{\"a\":\"comment-add\",\"id\":12993099,\"commentid\":19334206,\"acctid\":1298157}"}
它不包含实际的意见; 看来这只是用来告诉浏览器显示红色图标。 当您再按一下,它发出请求获得页面,包括注释。 问题ID(12993099),注释ID(19334206)和帐户ID(1298157)被包含在该帧中。
我看不出在上述任何这将阻止一些黑客创建一个web套接字来听您的通知。 饼干看我是谷歌分析的Cookie对我来说,至少在第二和第三个做。 也许首先是一些代码,你不会不知道,如果我不是刚刚出版它(无后顾之忧,我改变它!)。
在你的大气例子,我知道,当网络套接字不工作,则默认为长轮询,然后请求一个URL与它的频道名称。 所以,你可以让客户端产生只有它会知道和关联与登录的用户的频道名称。 但是,任何人嗅探网络将不得不再次访问您的流量,所以你必须使用安全套接字网络(WSS)和HTTPS(长轮询回退)将其固定。