【问题标题】:Spring Boot WebSockets unable to find the current user (principal)Spring Boot WebSockets 无法找到当前用户(主体)
【发布时间】: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

但它不起作用。

请帮帮我!

【问题讨论】:

    标签: spring spring-boot spring-security spring-websocket


    【解决方案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 接收消息
    • 是否可以通过一些实用程序类而不是方法来获取它?
    猜你喜欢
    • 2016-11-03
    • 2015-09-18
    • 2017-03-10
    • 2017-08-30
    • 1970-01-01
    • 2018-10-25
    • 2021-12-18
    • 2018-01-30
    相关资源
    最近更新 更多