我有一个带有websocket功能的简单弹簧应用程序,到目前为止一切正常.现在我想使用@SendToUser注释从我的服务器向特定客户端发送消息.这给了我错误"忽略消息,没有可用的主要信息".我知道我的服务器上没有任何登录信息,因此每个用户都是"匿名"且没有委托人(我现在不使用Spring安全性).但是每个用户都有一个session-id.是否有可能以某种方式使用会话ID来区分用户?我如何实现这一点,以便我的用户获得与session-id相对应的主体?
java spring spring-security spring-messaging spring-websocket
当我尝试在Spring websocket上从客户端向服务器发送消息时,我遇到了问题.我在服务器上配置Websocket并在控制器上创建@Message.我通过javascript从客户端发送数据.它有时会工作,但有时会失败并在服务器上抛出消息:MissingSessionUserException:消息中没有"user"标题
这是我的WebsocketConfig:
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/connectsocket").withSockJS();
}
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的MessageController:
@RestController
public class MessageController {
@Autowired
private SimpMessagingTemplate template;
@MessageMapping("/websocket/message")
public synchronized void message(Message<Object> messageObj,
WebMessage message, Principal principal) throws Exception {
if (principal != null) {
String name = principal.getName();
template.convertAndSendToUser(name, "/topic/dynamic", new MessagePojo("stage", "value", "message"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的Javascript-backbonejs代码:
app.Models.WebsocketModel = Backbone.Model.extend({
fetchData : function() {
console.log("WebsocketModel: fetchData");
var …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个简单的 websockets 应用程序,该应用程序可以将消息从一个端点发送到在其他地方建立的指定会话。到目前为止,我已经能够使用注释 @SendToUser() 以便客户端订阅频道(如本问题中所述:Spring Websockets @SendToUser without Login?)
但是,我现在想要创建一个单独的端点,当调用该端点时,它会查找与传递到该端点的数据关联的用户,并向该用户发送有关该数据的消息。
但是,我无法准确确定如何制作它,以便我可以调用 SimpMessagingTemplate ConvertAndSendToUser() 命令,因为我的用户没有主体(我没有使用 Spring Security)。
我已经能够从传递到 @MessageMapping 端点的 MessageHeaders 中获取 simpSessionId,但现在我无法弄清楚如何使用 simpSessionId 从应用程序的不同部分发送信息。
我已经做了一些研究,涉及重写 DefaultHandshakeHandler 的确定用户()方法,并在成功的 websocket 握手时将随机生成的 UUID 作为用户名分配给用户(如此问题的答案中所述:如何在 Spring 4 中回复未经身份验证的用户) STOMP over WebSocket 配置?),但由于出现的主体为 null,我不确定如何正确生成主体并将其分配给主体以供应用程序使用。
我基本上需要能够拥有匿名用户,并在他们创建 websocket 连接后从应用程序的不同部分向他们发送消息。