JavaScript,PHP – 使用服务器发送的事件与多个唯一用户?

我对SSE来说是全新的.服务器发送事件有很多简单/介绍性文本

> Here
> Here
> Here

但他们都没有涉及为多个不同的用户使用相同的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)发送到服务器端文件,和
>必须有一种方法只有那个特定用户才能收到所收集的信息

最佳答案

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(但正如您所说,这不是最好的安全类型).

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...