攔截
事件提供 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
的執行緒中提供 Hook。
請注意,如同先前描述的 SessionDisconnectEvent
,DISCONNECT 訊息可能來自客户端,也可能在 WebSocket 工作階段關閉時自動產生。在某些情況下,攔截器可能會針對每個工作階段多次攔截此訊息。組件對於多個中斷連線事件應具有等冪性。