跳到主要内容

拦截

ChatGPT-4o-mini 中英对照 Interception

Events 提供 STOMP 连接生命周期的通知,但并不是针对每个客户端消息。应用程序还可以注册一个 ChannelInterceptor 来拦截任何消息以及处理链中的任何部分。以下示例展示了如何拦截来自客户端的入站消息:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {

@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new MyChannelInterceptor());
}
}
java

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

public class MyChannelInterceptor implements ChannelInterceptor {

@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
StompCommand command = accessor.getCommand();
// ...
return message;
}
}
java

应用程序还可以实现 ExecutorChannelInterceptor,这是 ChannelInterceptor 的一个子接口,具有在处理消息的线程中进行回调的功能。虽然 ChannelInterceptor 对发送到通道的每条消息只调用一次,但 ExecutorChannelInterceptor 在每个订阅来自通道的消息的 MessageHandler 的线程中提供了钩子。

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