Spring Boot WebSockets 无法找到当前用户(主体)

Posted

技术标签:

【中文标题】Spring Boot WebSockets 无法找到当前用户(主体)【英文标题】:Spring Boot WebSockets unable to find the current user (principal) 【发布时间】:2017-06-22 05:28:50 【问题描述】:

登录后websockets无法通过session.getPrincipal()找到当前用户(返回null)。

这里是 WebSockets 的 Java 代码:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer 
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) 
        config.enableSimpleBroker("/queue", "/topic");
        config.setApplicationDestinationPrefixes("/socket");
        config.setUserDestinationPrefix("/user");
    

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) 
        registry.addEndpoint("/app").withSockJS();
    

这似乎是一个 Spring Boot 错误 - 我正在使用 1.3.8 RELEASE。刷新页面后,正确获取登录用户。

这里是前端(订阅)

ngstomp.subscribeTo('/user/queue/message')
.callback(function(response) 
    console.log('Test');
)
.withBodyInJson()
.connect();

我试过这个解决方案:https://www.javacodegeeks.com/2014/11/spring-boot-based-websocket-application-and-capturing-http-session-id.html

但它不起作用。

请帮帮我!

【问题讨论】:

【参考方案1】:

为什么你需要 session.getPricncipal()。 Spring 提供 Principal 对象自动注入到你的控制器中,如下所示。

@MessageMapping("/message")
public String processMessageFromClient(@Payload String message, Principal principal) throws Exception 
        messagingTemplate.convertAndSendToUser(principal.getName(),    "/queue/reply", name);
        return name;
    

参考:Spring Boot Websocket Example

【讨论】:

登录前的会话 ID 似乎与登录后的会话 ID 不同。 我正在使用注释:@SendToUser @MessageMapping("/message") @SendToUser public String loadMessage(@Payload String message) return message; 在服务器端你需要有@SendToUser("/queue/message"),然后客户端可以在/user/queue/message 接收消息 是否可以通过一些实用程序类而不是方法来获取它?

以上是关于Spring Boot WebSockets 无法找到当前用户(主体)的主要内容,如果未能解决你的问题,请参考以下文章

graphql-spring-boot-starter 只有 websockets 的应用程序

由于无效的升级标头,Spring Boot Websockets 握手失败:null

WebSocket握手期间出错:意外的响应代码:400 Spring boot websockets

tomcat7 spring boot应用程序中的websockets

从 Spring Boot Web 应用程序中的 Web 套接字获取数据

如何告诉 Spring Boot 忽略 Jetty 并始终使用 Tomcat?