Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Области видимости и пользователи веб-сокетов

По умолчанию веб-сокет находится в области видимости приложения. Например, любое представление или сессия в веб-приложении, в котором открыт один и тот же канал веб-сокета, получит одно и то же push-сообщение. Push-сообщение может быть отправлено любым пользователем и приложением. Чтобы ограничить push-сообщения всеми представлениями только в текущей сессии пользователя, установите для необязательного атрибута scope значение session. В этом случае push-сообщение может отправлять только пользователь, а не приложение.

<f:websocket channel="someChannel" scope="session" …​ />

Чтобы ограничить push-сообщения только текущим представлением, вы можете установить для атрибута scope значение view. Push-сообщение не будет отображаться в других представлениях той же сессии, даже если оно имеет тот же URL. Это push-сообщение может отправлять только пользователь, а не приложение.

<f:websocket channel="someChannel" scope="view" …​ />

Атрибут scope не может быть выражением EL.

Кроме того, вы можете установить необязательный атрибут user для уникального идентификатора вошедшего в систему пользователя, обычно это имя для входа или идентификатор пользователя. Таким образом, push-сообщение может быть предназначено для конкретного пользователя, а также может отправляться другими пользователями и приложением. Значение атрибута user должно реализовывать Serializable и иметь небольшой объём памяти, поэтому не рекомендуется использовать весь объект пользователя.

Например, когда вы используете управляемую контейнером аутентификацию, фреймворк или библиотеку:

<f:websocket channel="someChannel"user="#{request.remoteUser}" …​ />

Или, когда у вас есть пользователь, доступный через EL, например, #{someLoggedInUser}, который имеет свойство id, представляющее его идентификатор:

<f:websocket channel="someChannel"
user="#{someLoggedInUser.id}" ... />

Когда указан атрибут user, область видимости по умолчанию равна session и не может быть установлена ​​в application.

На стороне сервера push-сообщение может быть предназначено для пользователя, указанного в атрибуте user с помощью PushContext.send(Object, Serializable). Push-сообщение может быть отправлено любым пользователем и приложением.

@Inject @Push
private PushContext someChannel;

public void sendMessage(Object message, User recipientUser) {
  Long recipientUserId = recipientUser.getId();
  someChannel.send(message, recipientUserId);
}

Получателями могут быть несколько пользователей путём передачи Collection, содержащего идентификаторы пользователей, в PushContext.send(Object, Collection).

public void sendMessage(Object message, Group recipientGroup) {
  Collection<Long> recipientUserIds = recipientGroup.getUserIds();
  someChannel.send(message, recipientUserIds);
}

Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)