DefaultHandshakeHandler 的 determineUser 未在生产服务器上调用
DefaultHandshakeHandler's determineUser not called on Production Server
我有一个使用 Spring websockets 的 grails 项目。我已经实现了 DefaultHandshakeHandler 来为每个新会话创建随机主体名称并使用 convertAndSendToUser 来发送消息。
在本地运行一切正常。我还能够在 AWS EC2 Linux 实例 运行 最新 tomcat 上部署 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
我有一个使用 Spring websockets 的 grails 项目。我已经实现了 DefaultHandshakeHandler 来为每个新会话创建随机主体名称并使用 convertAndSendToUser 来发送消息。
在本地运行一切正常。我还能够在 AWS EC2 Linux 实例 运行 最新 tomcat 上部署 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