18.4 为目标用户发送消息

到目前为止,我们所发送和接收的消息都是客户端(在 Web 浏览器中)和服务器端之间的,并没有考虑到客户端的用户。当带有 @MessageMapping 注解的方法触发时,我们知道收到了消息,但是并不知道消息来源于谁。类似地,因为我们不知道用户是谁,所以消息会发送到所有订阅对应主题的客户端上,没有办法发送消息给指定用户。

但是,如果你知道用户是谁的话,那么就能处理与某个用户相关的消息,而不仅仅是与所有客户端相关联。好消息是我们已经了解了如何识别用户。通过使用与第 9 章相同的认证机制,我们可以使用 Spring Security 来认证用户,并为目标用户处理消息。 在使用 Spring 和 STOMP 消息功能的时候,我们有三种方式利用认证用户:

  • @MessageMapping 和 @SubscribeMapping 标注的方法能够使用 Principal 来获取认证用户;

  • @MessageMapping、@SubscribeMapping 和 @MessageException 方法返回的值能够以消息的形式发送给认证用户;

  • SimpMessagingTemplate 能够发送消息给特定用户。

我们首先看一下前两种方式,它们都能让控制器的消息处理方法使用针对特定用户的消息。