...
Además, el atributo opcional user puede establecerse con un identificador único, que hace referencia al usuario autenticado. Pude ser el nombre del usuario o un ID calculado. De esta forma, un mensjae mensaje push puede ser enviado a un usuario especifico y puede ser enviado por cualquier usuario o por la propia aplicación. El valor el atributo user tiene que implementar la interface Serializable y debe gastar poca memoria, por lo que la entidad que representa al usuario como la clase org.umu.atica.servicios.gesper.gente.entity.Persona o org.jboss.seam.security.Identity (y descendientes) no son recomendables. Podemos generar identificadores únicos mediante la clase java.util.UUID. Ejemplo de uso con el username:
| Bloque de código |
|---|
<fw:socket channel="someChannel" user="#{credentials.username}" ... /> |
...
Cuando especificamos el atributo user el ámbito por defecto se establece en session y no se puede establecer en application. Puede establecerse con view, pero es inusual y solo debe utilizarse si el usuario autenticado representado por el valor user, tiene un ciclo de vida más corto que la sesión HTTP, ejemplo: cuando la aplicación permite cambiar entre usuarios autenticados durante la misma sesión HTTP sin invalidar al anterior usuario, que es un muy mala práctica de seguridad. Si en el caso, de reutilizar un socket de ámbito sesión, se pueden producir comportamientos indeseados cuando se envía un mensaje push dirigido a un usuario determinado. Este puede ser enviado a un usuario anterior. Este problema se resuelve estableciendo el ámbito a view, recomendando realizar una invalidación de la sesión HTTP del usuario.
Cuando el atributo user es establecido mediante una expresión EL, y este cambia durante un petición AJAX, entonces el usuario del socket también se actualizará, incluso si ninguna petición AJAX cubre la definición del <fw:socket>. Hay que asegurarse de que el valor esta ligado al menos a una propiedad de la vista en caso de querer controlarlo durante el ámbito de la vista.
En el lado del servidor, el mensaje push puede ser dirigido al usuario especificado en el atributo user mediante PushContext.send(Object, Serializable). El mensaje push puede ser enviado por todos los usuarios o por la propia aplicación. Es útil para notificar a un usuario determinado por otros usuarios, por ejemplo: chat, mensajes por parte del administrador, etc.; o por tareas en segundo plano de la aplicación como por ejemplo: notificaciones, listeners, etc..
| Bloque de código |
|---|
@Push
private PushContext someChannel;
public void sendMessage(Object message, User recipientUser) {
Long recipientUserId = recipientUser.getId();
someChannel.send(message, recipientUserId);
} |