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

原因可能是:

1、web.xml中未加映射


dispatcher
org.springframework.web.servlet.DispatcherServlet
 
            contextConfigLocation
            classpath:spring-mvc.xml
       
  
1


dispatcher
/webSocketServer/*


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;  
    ......  

}



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






你可能感兴趣的:(java)