原因可能是:
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;
# 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;
......
}
注:以上的方法有的是我自己使用的,有的是從網上找的類似的,還沒來得及驗證,如有錯誤請多指教共同進步