|
对于最新的稳定版本,请使用 Spring Framework 7.0.6! |
拦截
事件 为 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 类似,断开消息可以来自客户端,也可以在 WebSocket 会话关闭时自动生成。在某些情况下,拦截器可能会对每个会话多次拦截此消息。组件应针对多个断开事件具有幂等性。