我对SSE来说是全新的.服务器发送事件有很多简单/介绍性文本
例如:
我有一个用户登录的站点.登录后,他们可以查看对他们来说唯一且私有的数据.我希望每个用户在登录时都有实时更新,这些更新可能包含也可能不包含敏感信息.为此,我正在实现服务器发送的事件:
JS(直接从其中一个链接)
var source;
if (!!window.EventSource) {
source = new EventSource("sse.PHP");
} else {
...
}
source.addEventListener("message",function(e) {
... do stuff ...
},false);
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
header("Connection: keep-alive");
while (true) {
$data = \\ query DB or any other source
if ($data) {
sendMessage($someID,$data);
}
sleep(2);
}
function sendMessage($id,$data) {
echo "id: $id\n";
echo "data: $data\n\n";
ob_flush();
flush();
}
但是这样使用它,我只是将数据发送给打开sse.PHP源的用户(即每个EventSource(“sse.PHP”)是一个新的,唯一的连接)?或者每个人都登录,谁初始化了连接,收到相同的数据?
This SO answer通过使用独特事件触及多个用户:
echo "event: ping\n";
$msg1="This is first user";
echo 'data: {"msg": "' . $msg1 . '"}';
echo "\n\n";
echo "event: notify\n";
$msg2="This is second user";
echo 'data: {"msg": "' . $msg2 . '"}';
echo "\n\n";
然后只听一个特定的事件:
var evtSource = new EventSource("sender.PHP");
evtSource.addEventListener("ping",function(e) {
var obj = JSON.parse(e.data);
var r_msg = obj.msg;
但这似乎不合理.如果每个用户都应该接收他们自己的私人订阅源,那么这种方法将要求我为每个用户硬编码一个唯一的事件.并且,正如最初的答案所提到的,它不会阻止略高于平均水平的用户拦截和阅读所有其他消息.
而且,最重要的是,sse.PHP文件不知道它正在为哪个用户收集数据,因此它必须始终对所有用户进行操作.
如何创建一个sse.PHP文件,该文件可以处理无限数量的唯一用户,并且只将数据发送给相应的用户?所以:
>必须有一种方法将一些初始化数据(即唯一用户ID)发送到服务器端文件,和
>必须有一种方法只有那个特定用户才能收到所收集的信息
am I only sending the data to the user who opened the sse.PHP source
是.
Or will everyone logged on,who has initialized the connection,receive the same data?
没有.
If each user is supposed to be receiving their own private Feed,
then this method would require me to hard-code a unique event for each user
幸运的是没有! SSE“事件”用于将单个连接的不同类型的事件发送给单个用户.一个用例可能是Facebook希望使用一个事件来发送聊天更新,另一个事件用于发送朋友请求,另一个用于发送要显示的广告等.
在我的书(带有HTML5 SSE的数据推送应用程序,http://shop.oreilly.com/product/0636920030928.do – 为插件道歉!)我认为它是多余的,并且作为你正在推动的json对象的一部分更好地包含在内.
And,on top of it all,the sse.PHP file doesn’t know which user …
Cookie已发送.因此,典型的方法是首先登录用户,创建一个验证它们的cookie,然后调用sse脚本.如果使用具有会话支持的服务器系统(例如PHP),则cookie是实现细节.
无法发送POST数据和自定义标头.因此,如果cookie不是一个选项,您必须使用GET发布一些身份验证ID(但正如您所说,这不是最好的安全类型).