WebSocket配置中會遇到的一些問題

語言: CN / TW / HK

 

1.使用nginx代理後不能訪問。報錯WARNING:tornado.access:400 GET /ws (127.0.0.1) 0.79ms  或者連線失敗後會反覆發起連線請求。

需要在nginx的location中新增如下配置

# websocket

 proxy_http_version 1.1;

 proxy_set_header Upgrade $http_upgrade;

 proxy_set_header Connection "upgrade";

2. 跨域問題(spring websocket)

    經查閱官方文件springwebsocket 4.1.5版本前預設支援跨域訪問,之後的版本預設不支援跨域,需要設定

.setAllowedOrigins(“*”)

@Override

public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

registry.addHandler(myWebSocketHandler(), "/echo.do").setAllowedOrigins("*").addInterceptors(new HandshakeInterceptor()); 

 

registry.addHandler(myWebSocketHandler(), "/echo").setAllowedOrigins("*").addInterceptors(new HandshakeInterceptor())

.withSockJS(); 

}

3 *.do配置導致sockjs失效問題(spring websocket)

web.xml中新增如下配置

<servlet-mapping>

<servlet-name>dispatcher</servlet-name>

<url-pattern>/sockjs/*</url-pattern>

</servlet-mapping>

websocket配置類中路徑中不加sockjs

registry.addHandler(myWebSocketHandler(), "/echo").setAllowedOrigins("*").addInterceptors(new HandshakeInterceptor())
.withSockJS(); 

前端呼叫時應加上sockjs

websocket = new SockJS("http://127.0.0.1:8080/WebSocketTest001/sockjs/echo");

4. 一個websocketsession對應多個session的情況

  這是由於儘管每次都能保證有一個websocketsession存在,但客戶端沒連線一次tomcat都建立一個連結,除非你在請求頭裡新增cookie:JSESSIONID=xxxxxx

5. 能收到客戶端訊息,後臺也顯示傳送,但是客戶端收不到

這個問題經我個人觀察和猜測,應該是websocketsession沒有成功關閉或者成功關閉但是和一個websocketsession對應多個session有關,因為我把上面的問題解決了之後,這個問題也沒出現過了。