拦截

事件提供了关于STOMP连接生命周期的通知,但并非每个客户端消息都会触发事件。应用程序还可以注册一个ChannelInterceptor来拦截任何消息,并在处理链的任何部分进行拦截。以下示例展示了如何拦截来自客户端的入站消息:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

	@Override
	public void configureClientInboundChannel(ChannelRegistration registration) {
		registration.interceptors(new MyChannelInterceptor());
	}
}

自定义ChannelInterceptor可以使用StompHeaderAccessorSimpMessageHeaderAccessor来访问有关消息的信息,如以下示例所示:

public class MyChannelInterceptor implements ChannelInterceptor {

	@Override
	public Message<?> preSend(Message<?> message, MessageChannel channel) {
		StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message);
		StompCommand command = accessor.getStompCommand();
		// ...
		return message;
	}
}

应用程序还可以实现ExecutorChannelInterceptor,这是ChannelInterceptor的子接口,具有在处理消息的线程中进行回调的功能。虽然ChannelInterceptor对每个发送到通道的消息调用一次,但ExecutorChannelInterceptor在每个订阅来自通道消息的MessageHandler的线程中提供了钩子。

请注意,与之前描述的SessionDisconnectEvent一样,DISCONNECT消息可以来自客户端,也可以在WebSocket会话关闭时自动生成。在某些情况下,拦截器可能会多次拦截每个会话的此消息。组件应对多个断开连接事件保持幂等性。