攔截
事件提供了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會話關閉時自動生成。在某些情況下,攔截器可能會為每個會話多次攔截此訊息。元件應該對多次斷開連線事件具有冪等性。