DefaultSubscriptionRegistry 及其受保护的方法



我正在尝试在我的SpringBoot应用程序中使用STOMP实现WebSocket功能。到目前为止,这进展顺利,但我遇到了一个问题。

取消订阅主题似乎总是从浏览器方面完成。但是,使用 @DestinationVariable 我可以创建许多主题(例如,使用路径/{game_id}/chat),并且我需要服务器端的安全功能。

由于消息已授权,因此我能够检查登录的用户是否确实有权访问{game_id}。如果他们不这样做,订阅应该结束(而不是 WebSocket 连接!为此,我自动连接了 DefaultSubscriptionRegistry 以从列表中删除订阅,但此方法显然受到保护。我现在发现自己不知道如何从 Spring 内部删除此订阅(由 Spring 提供的简单代理管理)。

我想另一种方法是模拟来自浏览器的取消订阅消息并让 MessageHandler 处理它。但这带来了自己的挑战,主要是获取简单代理的应用程序上下文(我没有亲自编辑)。

以前有人遇到过这个挑战吗?是否有好的解决方法/替代方案可以从服务器端取消订阅?

Rossen在GitHub上给出了一个答案,我相信这个答案会有所帮助。

从本质上讲,方法是注册一个创建模拟取消订阅消息的ChannelInterceptor

@Override
public Message<?> beforeHandle(Message<?> message, MessageChannel channel, MessageHandler handler) {
StompHeaderAccessor headers = 
StompHeaderAccessor.create(StompCommand.UNSUBSCRIBE);
// ... add headers
Message<?> unsubscribe = MessageBuilder
.withPayload(new byte[0]).setHeaders(headers).build();
messageHandler.handleMessage(unsubscribe);
return message;
}

最新更新