此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
拦截
事件提供生命周期的通知
STOMP 连接,但不是每条客户端消息。应用程序还可以注册ChannelInterceptor
拦截处理链的任何部分的任何消息。
以下示例演示如何拦截来自客户端的入站消息:
-
Java
-
Kotlin
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer {
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new MyChannelInterceptor());
}
}
@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfiguration : WebSocketMessageBrokerConfigurer {
override fun configureClientInboundChannel(registration: ChannelRegistration) {
registration.interceptors(MyChannelInterceptor())
}
}
一个定制ChannelInterceptor
可以使用StompHeaderAccessor
或SimpMessageHeaderAccessor
访问有关消息的信息,如以下示例所示:
-
Java
-
Kotlin
public class MyChannelInterceptor implements ChannelInterceptor {
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
StompCommand command = accessor.getCommand();
// ...
return message;
}
}
class MyChannelInterceptor : ChannelInterceptor {
override fun preSend(message: Message<*>, channel: MessageChannel): Message<*> {
val accessor = StompHeaderAccessor.wrap(message)
val command = accessor.command
// ...
return message
}
}
应用程序还可以实现ExecutorChannelInterceptor
,这是一个子接口
之ChannelInterceptor
在处理消息的线程中回调。
虽然ChannelInterceptor
对于发送到通道的每条消息调用一次,则ExecutorChannelInterceptor
在每个的线程中提供钩子MessageHandler
订阅来自频道的消息。
请注意,与SessionDisconnectEvent
前面描述的 DISCONNECT 消息
可以来自客户端,也可以在
WebSocket 会话已关闭。在某些情况下,拦截器可能会拦截此内容
消息。组件应在
多个断开连接事件。