WebSocket Scopes and Users (original) (raw)
By default, the WebSocket is application-scoped. For example, any view or session throughout the web application having the same WebSocket channel open will receive the same push message. The push message can be sent by all users and the application. To restrict the push messages to all views in the current user session only, set the optional scope attribute to session
. In this case, the push message can only be sent by the user and not by the application.
<f:websocket channel="someChannel" scope="session" … />
To restrict the push messages to the current view only, you can set the scope attribute to view
. The push message will not show up in other views in the same session, even if it has the same URL. This push message can be sent only by the user and not by the application.
<f:websocket channel="someChannel" scope="view" … />
The scope attribute may not be an EL expression.
Additionally, you can set the optional user
attribute to the unique identifier of the logged-in user, usually the login name or the user ID. As such, the push message can be targeted to a specific user and can also be sent by other users and the application. The value of the user
attribute must implementSerializable
and have a low memory footprint, so an entire user entity is not recommended.
For example, when you are using container managed authentication or a related framework or library:
<f:websocket channel="someChannel"user="#{request.remoteUser}" … />
Or, when you have a custom user entity accessible via EL, such as#{someLoggedInUser}
which has an id
property representing its identifier:
<f:websocket channel="someChannel"
user="#{someLoggedInUser.id}" ... />
When the user
attribute is specified, the scope defaults to session
and cannot be set to application
.
On the server side, the push message can be targeted to the user specified in the user
attribute using PushContext.send(Object, Serializable)
. The push message can be sent by all users and the application.
@Inject @Push
private PushContext someChannel;
public void sendMessage(Object message, User recipientUser) { Long recipientUserId = recipientUser.getId(); someChannel.send(message, recipientUserId);
}
Multiple users can be targeted by passing a Collection
holding user identifiers to PushContext.send(Object, Collection)
.
public void sendMessage(Object message, Group recipientGroup) {
Collection<Long> recipientUserIds = recipientGroup.getUserIds();
someChannel.send(message, recipientUserIds);
}