2016-06-07 6 views
4

Я совершенно новый для SSE. Есть много простых/вводные тексты на сервер послал событияJavaScript, PHP - Использование серверных событий с несколькими уникальными пользователями?

Но ни один из них не коснуться, используя тот же файл 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, который может обрабатывать неограниченное количество уникальных пользователей, а только отправить данные соответствующему пользователю? Итак:

  1. должен быть способ отправить некоторые данные инициализации (то есть уникальный идентификатор пользователя) на стороне сервера файл, и

  2. должен быть способ для только что один конкретный пользователь, чтобы получить полученная информация

ответ

3

я только передавать данные пользователю, который открыл источник sse.php

Да.

Или все вошли в систему, кто инициализировал соединение, получили те же данные?

No.

Если каждый пользователь должен получать их собственный канал, то этот метод требует, чтобы я жестко закодировать уникальное событие для каждого пользователя

К счастью, нет! Событие SSE «событие» предназначено для отправки различных типов событий по одному соединению с одним пользователем. В прецеденте может быть Facebook, желающий использовать одно событие для отправки обновлений чата, другое событие для отправки запросов для друзей, другое для отправки объявлений для показа и т. Д.

В моей книге (Data Push Apps с HTML5 SSE, http://shop.oreilly.com/product/0636920030928.do - извинения за вилку!) Я утверждаю, что он избыточен и лучше включен как часть объекта json, который вы нажимаете.

И на вершине всего этого, файл sse.php не знает, какой пользователь ...

Cookies посылаются. Таким образом, типичный подход заключается в первом входе в систему пользователя, создании файла cookie, который их аутентифицирует, а затем вызывает сценарий sse. Если используется серверная система с поддержкой сеансов (например, PHP), куки-файлы являются деталями реализации.

Данные POST и пользовательские заголовки не могут быть отправлены. Поэтому, если файлы cookie не являются вариантом, вам нужно будет использовать GET для публикации идентификатора аутентификации (но, как вы заметили, это не лучший тип безопасности).

0

SSE - это открытое HTTP-соединение. Таким образом, он будет отправлять уникальные данные только пользователю, если вы его программируете.Вы можете сделать это с сохранением состояния, используя сеанс, куки, IP-адреса и т. Д., В том же порядке, что и любой другой HTTP-запрос. Основным ограничением SSE является то, что вы не можете добавлять заголовки для запроса на соединение.

 Смежные вопросы

  • Нет связанных вопросов^_^