java - Spring session + Spring Web 套接字。根据 session ID 向特定客户端发送消息

标签 java spring stomp spring-websocket spring-session

我已关注Quetion1Quetion2从堆栈溢出向特定客户端发送消息,基于其sessionId,但找不到成功。

下面是我的示例 RestController 类

@RestController
public class SpringSessionTestApi {

@Autowired
public SimpMessageSendingOperations messagingTemplate;

@MessageMapping("/messages")
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception {

    String sessionId  = (String) headerAccessor.getSessionAttributes().get("SPRING.SESSION.ID");
    messagingTemplate.convertAndSendToUser(sessionId,"/queue/test",message, createHeaders(sessionId));

   }

private MessageHeaders createHeaders(String sessionId) {
    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
    headerAccessor.setSessionId(sessionId);
    headerAccessor.setLeaveMutable(true);
    return headerAccessor.getMessageHeaders();
   }
}

Session Id:当客户端发送createSession请求时,会生成新的spring sessionId,并将其存储在MongoDB中。之后,当客户端发送 Web 套接字连接请求时,会收到相同的 sessionId,该 sessionId 按预期存储在 mongoDb 中。直到这一切都工作正常。

现在我的工作是根据 sessionId 将响应发送回客户端。 为此,我有以下网络套接字类:

@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends
    AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> {

@Override
protected void configureStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/messages");
}

public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.enableSimpleBroker("/queue");
    registry.setApplicationDestinationPrefixes("/app");
   }
}

我用来连接的示例客户端代码是:

function connect() {

stompClient = Stomp.client('ws://localhost:8016/messages');
stompClient.debug = null;

stompClient.connect({}, function (frame) {
    setConnected(true);
    console.log('Connected: ' + frame);
    stompClient.subscribe('/user/queue/test', function (greeting) {
        console.log("Hello "+greeting);
        console.log("Greeting body "+JSON.parse(greeting.body));

    });
});
}

请帮忙,我哪里做错了? 提前致谢!

最佳答案

如果您像这样使用/user channel ,请尝试按所述 here 传递用户。 .

@MessageMapping("/messages")
public void greeting(HelloMessage message, SimpMessageHeaderAccessor headerAccessor, Principal principal) 
    throws Exception {
    messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/test", message);
}

关于java - Spring session + Spring Web 套接字。根据 session ID 向特定客户端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43536507/

相关文章:

java - 包含来自同一包的接口(interface) (Java)

java - 如何从一台计算机访问同一网络上的另一台计算机的本地主机服务器

java - Spring组件对一个字段的多个实现的依赖注入(inject)

java - RabbitMQ 的 Servlet 端点

ios - 无法在服务器(SpringBoot)和 iOS 之间建立 WebSocket 连接

java - 如何将 d3 (javascript) 添加到 vaadin 应用程序?

java - 重命名自定义 JTable 的列 - Java

java - 在 Spring MVC 应用程序中将 DAO 对象转换为 DTO 对象

java - 如何使用 spring batch 读取具有关联的 JPA 实体

Swift StompClient 与 SockJS 在连接期间的行为不一致