websocket 连通 握手失败 400错误 nginx代理

原因可能是:

1、web.xml中未加映射

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param> 
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>  
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/webSocketServer/*</url-pattern>

</servlet-mapping>


2、在本地和测试环境,用了ip和映射访问都没有问题,但是到了试运行环境把端口号、项目名全部集成在一个域名下,使用nginx 代理后不能访问

解决办法:把nginx升级到upgrade协议

修改nginx的配置

upstream wsbackend {
        server 127.0.0.1:3000;
    }
    server {
        listen       8090;
        server_name  localhost;
        #charset koi8-r;

        #access_log  logs/host.access.log  main;


        # location / {
        #    root   html;
        #    index  index.html index.htm;
        # }


        location / {
            proxy_pass http://wsbackend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }


3、问: a) The 'Access-Control-Allow-Origin' header contains multiple values '*, http://localhost', but only one is allowed. Origin 'http://localhost' is therefore not allowed access.

           b)  websocket._exceptions.WebsocketBadStatusException: Handshake status 400

  答:Access-Control-Allow-Origin是HTML5中定义的一种服务器端返回Response header,用来解决资源(比如字体)的跨域权限问题。它定义了该资源允许被哪个域引用,或者被所有域引用(google字体使用*表示字体资源允许被所有域引用)。

  解决办法:只需要 add_header Access-Control-Allow-Origin 一次就好!

http {  
    ......  
    add_header Access-Control-Allow-Origin *;  
    add_header Access-Control-Allow-Headers X-Requested-With;  
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;  
    ......  

}



注:以上的方法有的是我自己使用的,有的是从网上找的类似的,还没来得及验证,如有错误请多指教共同进步






WebSocket中的“bad handshake”错误通常指的是发起WebSocket握手时出现的问题。WebSocket握手是一种在客户端和服务器之间建立WebSocket连接的过程。 当客户端尝试与服务器建立WebSocket连接时,它会发送一个握手请求。服务器应该解析该请求并返回一个握手应答,以确认连接的建立。 然而,如果服务器无法正确解析或处理握手请求,就会发生“bad handshake”错误。这可能由以下几种原因导致: 1. 不支持的协议版本:WebSocket有多个协议版本,如果客户端和服务器使用不同的协议版本,则握手失败。解决此问题的一种方法是确保客户端和服务器都使用相同的协议版本。 2. 错误的握手请求头:握手请求应包含特定的请求头信息,例如“Upgrade”和“Connection”。如果请求头不正确或缺少必需的字段,服务器将无法正确解析请求,从而导致握手失败。 3. 跨域问题:浏览器中的WebSocket受到同源策略的限制,这意味着浏览器只允许在相同域名下的WebSocket通信。如果客户端和服务器位于不同的域名下,浏览器将拒绝建立连接。 解决“bad handshake”错误的方法通常包括以下几步: 1. 检查协议版本:确认客户端和服务器使用相同的WebSocket协议版本。 2. 检查请求头:确保握手请求中包含正确的请求头信息,并符合WebSocket协议的规范。 3. 处理跨域问题:如果客户端和服务器位于不同的域名下,可以通过配置服务器响应中的“Access-Control-Allow-Origin”头来解决跨域问题。 如果以上步骤仍然无法解决问题,可能需要进一步检查服务器端的代码和配置,以确保正确处理WebSocket握手请求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值