amazon-web-services - DefaultHandshakeHandler 的 determineUser 未在生产服务器上调用

标签 amazon-web-services tomcat grails amazon-ec2 spring-websocket

我有一个使用 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/

相关文章:

java - 如何在 apache servicemix 中的组件之间交换消息

java - 在 Controller 中找不到 Grails 输入字段参数

hibernate - GORM协会解释

grails - 如何在 Grails 3.x 中配置 JNDI 数据源?

apache - 为什么当 AWS Elastic BeanStalk 中的网络服务器更改为 nginx 时我的网页标题显示 "Apache"

web-services - 自动创建的EC2实例以及如何删除(终止)它?

amazon-web-services - 每次堆栈更新和创建时,AWS Cloudformation 运行一次命令

amazon-web-services - AWS Step Function 失败时调用 SNS

eclipse - Tomcat:生成的上下文路径与 Eclipse Juno 中的克隆应用程序不同

java - 在 Tomcat 上配置 SSL |获取空白文件