|
对于最新稳定版本,请使用 Spring Framework 7.0.6! |
拦截
事件(Events)用于提供 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 会话关闭时自动生成。在某些情况下,一个拦截器可能会对每个会话多次拦截此消息。相关组件应针对多次断开连接事件具备幂等性。