拦截
事件 提供 STOMP 连接生命周期的通知,但不提供每个客户端消息的通知。应用程序还可以注册一个 ChannelInterceptor
来拦截任何消息,并在处理链的任何部分进行拦截。以下示例展示了如何拦截来自客户端的入站消息
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new MyChannelInterceptor());
}
}
自定义 ChannelInterceptor
可以使用 StompHeaderAccessor
或 SimpMessageHeaderAccessor
来访问有关消息的信息,如下例所示
public class MyChannelInterceptor implements ChannelInterceptor {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
StompCommand command = accessor.getStompCommand();
// ...
return message;
}
}
应用程序还可以实现 ExecutorChannelInterceptor
,它是 ChannelInterceptor
的子接口,在处理消息的线程中具有回调。虽然 ChannelInterceptor
针对发送到通道的每条消息调用一次,但 ExecutorChannelInterceptor
在订阅来自通道的消息的每个 MessageHandler
的线程中提供挂钩。
请注意,与之前描述的SessionDisconnectEvent
类似,DISCONNECT 消息可以来自客户端,也可以在 WebSocket 会话关闭时自动生成。在某些情况下,拦截器可能会为每个会话拦截此消息多次。组件应该对多个断开连接事件具有幂等性。