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