对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

拦截

事件为生命周期提供通知 的 STOMP 连接,但并非针对每条客户端消息。应用程序还可以注册ChannelInterceptor拦截任何消息和处理链的任何部分。 以下示例显示如何拦截来自客户端的入站消息:spring-doc.cadn.net.cn

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

自定义ChannelInterceptor可以使用StompHeaderAccessorSimpMessageHeaderAccessor访问有关消息的信息,如下例所示:spring-doc.cadn.net.cn

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订阅来自频道的消息。spring-doc.cadn.net.cn

请注意,与SessionDisconnectEvent前面描述的 DISCONNECT 消息 可以来自客户端,也可以在 WebSocket 会话已关闭。在某些情况下,拦截器可能会拦截此 message 的请求。组件在 多个断开连接事件。spring-doc.cadn.net.cn