Interception

    事件 为 STOMP 连接的生命周期提供通知,但不是为每个客户端消息提供通知。应用程序也可以注册一个 ChannelInterceptor 来拦截任何消息和处理链中的任何部分。下面的例子显示了如何拦截来自客户端的入站消息:

    1. @Configuration
    2. @EnableWebSocketMessageBroker
    3. public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    4. @Override
    5. public void configureClientInboundChannel(ChannelRegistration registration) {
    6. registration.interceptors(new MyChannelInterceptor());
    7. }
    8. }

    一个自定义的 ChannelInterceptor 可以使用 StompHeaderAccessor 或 SimpMessageHeaderAccessor 来访问有关消息的信息,如下所示:

    1. public class MyChannelInterceptor implements ChannelInterceptor {
    2. @Override
    3. public Message<?> preSend(Message<?> message, MessageChannel channel) {
    4. StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
    5. StompCommand command = accessor.getStompCommand();
    6. // ...
    7. return message;
    8. }
    9. }

    应用程序也可以实现 ExecutorChannelInterceptor,它是 ChannelInterceptor 的一个子接口,在处理消息的线程中具有回调功能。虽然 ChannelInterceptor 对于发送到通道的每个消息都被调用一次,但 ExecutorChannelInterceptor 在订阅通道消息的每个MessageHandler 的线程中提供钩子。

    注意,与前面描述的 SessionDisconnectEvent 一样,DISCONNECT 消息可以来自客户端,也可以在 WebSocket 会话关闭时自动生成。在某些情况下,拦截器可以为每个会话拦截该消息一次以上。对于多个断开连接事件,组件应该是空闲的。

    :::warning 拦截器不能拦截事件中的 已连接(CONNECTED)生命周期状态,所以除了对消息做一定手脚之外,还不清楚有什么用途 :::