我是SSE的全新品牌。服务器发送事件有很多简单/介绍性文本
但他们都没有涉及为多个不同的用户使用相同的SSE文件。
例如:
我有一个用户登录的网站。登录后,他们可以查看对他们来说唯一且私有的数据。我希望每个用户在登录时都能获得实时更新,这些更新可能包含也可能不包含敏感信息。为此,我正在实现服务器发送的事件:
JS(直接从其中一个链接开始)
var source;
if (!!window.EventSource) {
source = new EventSource("sse.php");
} else {
...
}
source.addEventListener("message", function(e) {
... do stuff ...
}, false);
PHP
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)发送到服务器端文件,并且
只有一个特定用户才能接收收集的信息
答案 0 :(得分:3)
我只是将数据发送给打开sse.php源的用户
是
或者每个人都登录,谁初始化了连接,都会收到相同的数据?
没有
如果每个用户都应该收到自己的私人Feed, 那么这种方法需要我为每个用户硬编码一个唯一的事件
幸运的是没有! SSE“事件”用于将单个连接的不同类型的事件发送给单个用户。一个用例可能是Facebook希望使用一个事件来发送聊天更新,另一个事件用于发送朋友请求,另一个用于发送广告以显示等等。
在我的书(使用HTML5 SSE的数据推送应用程序,http://shop.oreilly.com/product/0636920030928.do - 为插件道歉!)我认为它是多余的,并且更好地作为您正在推动的json对象的一部分。
而且,最重要的是,sse.php文件不知道哪个用户......
发送Cookie。因此,典型的方法是首先登录用户,创建一个验证它们的cookie,然后调用sse脚本。如果使用具有会话支持的服务器系统(例如PHP),则cookie是实现细节。
无法发送POST数据和自定义标头。因此,如果cookie不是一个选项,你必须使用GET发布一些身份验证ID(但正如你所说,这不是最好的安全类型)。
答案 1 :(得分:0)
SSE是一个开放的HTTP连接。因此,如果您对其进行编程,它只会向用户发送唯一数据。您可以通过使用会话,cookie,IP地址等使其与任何其他HTTP请求相同。 SSE的主要限制是您无法添加任何标头来请求连接。