Spring STOMP-拦截器

发布于:2024-05-20 ⋅ 阅读:(154) ⋅ 点赞:(0)

Events 为 STOMP 连接的生命周期提供通知,但并非针对每个客户端消息。应用程序还可以注册 ChannelInterceptor来拦截处理链任何部分的任何消息。以下示例显示如何拦截来自客户端的传入消息:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

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

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

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