我写了一个小项目,它使用带有Websockets的Spring MVC 4和RabbitMQ作为代理。 我试图发送回单个用户(convertAndSendToUser),但我似乎无法让它工作。这是应用程序的作用:
在通过AJAX进行身份验证后,webapp使用STOMP over Websockets连接到API。 这些是在CONNECT FRAME
中发回的标题身体:“” 命令:“已连接” 标题:对象 心跳:“0,0” 服务器:“RabbitMQ / 3.3.1” 会话:“session-OGzAN6T8Y0X9ft3Jq04fiQ” 用户名:“88dc9424-72e3-4814-be8c-e31dbf89b521” 版本:“1.1”
如您所见,没有框架后缀或会话ID字段。
如何解决这个问题?我希望在连接时将队列后缀/会话ID发送回给我,以便客户端可以获得此后缀并订阅其唯一的队列。目前没有消息从服务器返回,因为缺乏信息。
答案 0 :(得分:0)
如果我错了,请纠正我,但由于UserDestinationMessageHandler,客户端应该能够订阅/user/exchange/jobs
,并且该消息处理程序将为您更正队列名称。
作为旁注,您还应该考虑添加一个扩展AbstractSecurityWebSocketMessageBrokerConfigurer的配置类,类似于以下内容:
@Configuration
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
messages
.antMatchers(SimpMessageType.MESSAGE, "/topic/**", "/queue/**").denyAll() // Prevent users sending messages directly to topics and queues
.antMatchers(SimpMessageType.SUBSCRIBE, "/queue/**/*-user*", "/topic/**/*-user*").denyAll() // Prevent users from subscriptions to private queues
.antMatchers("/user/queue/errors").permitAll()
.anyMessage().hasRole("ANY_OPTIONAL_ROLE_ETC")
;
}
}
这将阻止"进取"用户订阅他们不应该做的事情。