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

}



注:以上的方法有的是我自己使用的,有的是從網上找的類似的,還沒來得及驗證,如有錯誤請多指教共同進步






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章