攔截器

事件提供了 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 可以使用 StompHeaderAccessorSimpMessageHeaderAccessor 來訪問訊息的資訊,如下例所示:

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