Spring,SockJS - WebSocket握手期间出错:意外的响应代码400

时间:2016-11-01 19:14:35

标签: java spring nginx websocket sockjs

我已经使用Spring Boot实现了支持WebSockets的BE应用程序。我使用SockJS连接到我的WebSocket端点,在连接过程中我收到以下错误:

error during WebSocket handshake: Unexpected response code: 400

enter image description here

然后(如上图所示)一切正常,websocket打开。

目前我不明白这个问题可能是什么原因以及如何解决这个问题。请帮忙。

已更新

感谢paweln1986帮助我修复了SockJS lib的版本问题但是仍然存在意外响应代码400的问题:

enter image description here

我也在Tomcat 8前面使用nginx。这是我的nginx配置:

server {
    listen          443 ssl;        
    server_name  myserver.com;
    ssl on;

    location /api/ {                                                                                                                                                                                                                                             
        proxy_pass_header X-XSRF-TOKEN;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
        proxy_pass        http://localhost:8081/api/;                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
        proxy_set_header Origin "http://localhost:8081/api/";                                                                                                                                                                                                    

        proxy_set_header Host $host;                                                                                                                                                                                                                             
        proxy_set_header X-Real-IP $remote_addr;                                                                                                                                                                                                                 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;                                                                                                                                                                                             
        proxy_http_version 1.1;                                                                                                                                                                                                                                  
    }                                                                                                                                                                                                                                                            

    location /dashboard/ {
        proxy_pass        http://localhost:8081/dashboard/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /manager {
        proxy_pass        http://localhost:8081/manager/;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }        

    location / {
        root   /srv/www/htdocs/myserver/;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /srv/www/htdocs/;
    }        

} 

2 个答案:

答案 0 :(得分:3)

您的SockJS版本错误。

  

在浏览器端,应用程序可以使用模拟W3C WebSocket API的sockjs-client(版本1.0.x)

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html

您在 / api / 部分下缺少两件事 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; https://www.nginx.com/blog/websocket-nginx/

答案 1 :(得分:1)

如果您将SSL与Amazon负载均衡器一起使用,也会发生这种复杂情况。 elb的侦听器应具有SSL(而不是HTTPS)条目,负载均衡器端口为443,实例协议为TCP,实例端口为80(不要忘记添加证书) 这将使WebSocket通信能够通过。

详细参考: https://blog.jverkamp.com/2015/07/20/configuring-websockets-behind-an-aws-elb/