Spring、SockJS - WebSocket 握手期间出错:意外的响应代码 400
Spring, SockJS - error during WebSocket handshake: Unexpected response code 400
我已经使用 Spring Boot 实现了支持 WebSockets 的 BE 应用程序。我使用 SockJS 连接到我的 WebSocket 端点,在连接过程中我收到以下错误:
error during WebSocket handshake: Unexpected response code: 400
但是随后(如上图所示)一切正常,websocket 打开了。
现在我不明白这个问题的原因是什么以及如何解决它。请帮忙。
已更新
感谢 paweln1986 帮助我解决了 SockJS 库的版本问题,但意外响应代码 400 的问题仍然存在:
前面我也用nginx Tomcat 8.这是我的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/;
}
}
你的 SockJS 版本有误。
On the browser side, applications can use the sockjs-client (version 1.0.x) that emulates the W3C WebSocket API
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/
如果您将 SSL 与 Amazon 负载均衡器一起使用,也会出现这种情况。 elb 的侦听器应该有一个 SSL(而不是 HTTPS)条目,负载均衡器端口为 443,实例协议为 TCP,实例端口为 80(不要忘记添加证书)
这将使 WebSocket 流量通过。
详细参考:
https://blog.jverkamp.com/2015/07/20/configuring-websockets-behind-an-aws-elb/
我已经使用 Spring Boot 实现了支持 WebSockets 的 BE 应用程序。我使用 SockJS 连接到我的 WebSocket 端点,在连接过程中我收到以下错误:
error during WebSocket handshake: Unexpected response code: 400
但是随后(如上图所示)一切正常,websocket 打开了。
现在我不明白这个问题的原因是什么以及如何解决它。请帮忙。
已更新
感谢 paweln1986 帮助我解决了 SockJS 库的版本问题,但意外响应代码 400 的问题仍然存在:
前面我也用nginx Tomcat 8.这是我的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/;
}
}
你的 SockJS 版本有误。
On the browser side, applications can use the sockjs-client (version 1.0.x) that emulates the W3C WebSocket API
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/
如果您将 SSL 与 Amazon 负载均衡器一起使用,也会出现这种情况。 elb 的侦听器应该有一个 SSL(而不是 HTTPS)条目,负载均衡器端口为 443,实例协议为 TCP,实例端口为 80(不要忘记添加证书) 这将使 WebSocket 流量通过。
详细参考: https://blog.jverkamp.com/2015/07/20/configuring-websockets-behind-an-aws-elb/