我有一个使用 Spring websockets 的 grails 项目。我已经实现了 DefaultHandshakeHandler 来为每个新 session 创建随机主体名称并使用 convertAndSendToUser 来发送消息。
本地运行一切正常。我还能够在运行最新 tomcat 的 AWS EC2 Linux 实例上部署 WAR 文件。文件部署良好,可以正确检测到 websockets 上的连接和断开事件。*
唯一的问题是,我的 CustomHandshakeHandler 的 determineUser 没有在生产环境中被调用。因此,我的 StompHeaderAccessor 的主体始终为 null,并且代码开始出现 NPE。
这就是我声明 CustomHandshakeHandler 的方式:
class CustomHandshakeHandler extends DefaultHandshakeHandler {
@Override
protected Principal determineUser(ServerHttpRequest request,
WebSocketHandler wsHandler,
Map<String, Object> attributes) {
// Generate principal with UUID as name
return new StompPrincipal(UUID.randomUUID().toString())
}
}
这就是我设置握手处理程序配置的方式:
@Override
void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
stompEndpointRegistry.addEndpoint("/ws-ep") // Set websocket endpoint to connect to
.setHandshakeHandler(new CustomHandshakeHandler()) // Set custom handshake handler
.withSockJS() // Add Sock JS support for frontend
}
我尝试在本地 Tomcat 8 上部署相同的 WAR 文件,它再次运行良好。看来问题是由于 AWS 引起的。我还搜索了其他一些与 AWS 和 websocket 相关的问题。我遇到了一些与 ELB 兼容性相关的事情,但我不认为这是我的情况,因为我的 websockets 工作正常(正在接收事件)
有人可以帮忙或指出正确的方向吗
最佳答案
问题出在将 Http 请求升级为 WS 请求的 Nginx 设置上。这个问题很有帮助:Spring WebSocket: Handshake failed due to invalid Upgrade header: null
关于amazon-web-services - DefaultHandshakeHandler 的 determineUser 未在生产服务器上调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47982734/