拦截器

事件提供了 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 会话关闭时自动生成。在某些情况下,拦截器可能会为每个会话多次拦截此消息。组件对于多次断开事件应具有幂等性。