DefaultHandshakeHandler确定未在Production Server上调用用户

时间:2017-12-26 19:09:24

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

我有一个使用Spring websockets的grails项目。我已经实现了DefaultHandshakeHandler来为每个新会话创建随机主体名称,并使用convertAndSendToUser发送消息。

在本地运行中一切正常。我还能够在运行最新tomcat的AWS EC2 Linux实例上部署WAR文件。该文件部署正常,可以正确检测websockets上的Connect和Disconnect事件。*

唯一的问题是,我的CustomHandshakeHandler确定用户在生产时没有被调用。由于这个原因,我的StompHeaderAccessor的主体始终为null,代码开始吐出NPE。 / p>

这是我声明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工作正常(正在收到活动)

有人可以帮忙或指点我正确的方向

1 个答案:

答案 0 :(得分:0)

问题在于Nginx设置将Http请求升级为WS请求。这个问题有很多帮助:Spring WebSocket: Handshake failed due to invalid Upgrade header: null