Java Platform, Enterprise Edition (Java EE) 8 The Java EE Tutorial

## WebSocket Scopes and Users

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 implement `Serializable` 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);
    }

Copyright © 2017, Oracle and/or its affiliates. All rights reserved.