最近在做一個WebSocket項目,后台使用了Stomp協議的WebSocketConfigurer,但是前端在測試的時候,發現一個很奇怪的問題:
本地的測試代碼,最初我使用了Java+SockJS實現:
@Configuration @EnableWebSocketMessageBroker public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/density") .setAllowedOrigins("*") //解決跨域問題 .withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); } }
var url = "http://172.18.171.167:8080/density" var socket = new SockJS(url) var stompClient = Stomp.over(socket)
這種情況下自測可以通過
但是前端反應,SockJS不支持同時打開多個Socket訂閱(我也不清楚到底是否真實,懶得追究了),於是需要研究如何在前端通過原生WebSocket的方式而不是SockJS的方式建立客戶端(BTW 我一直覺得這是前端的活兒,我也不明白我一個后端為什么要搞這個)
按照網上的教程,寫了如下的代碼:
var stompClient = Stomp.client('ws://172.18.171.167:8080/density'); stompClient.connect({}, function (frame) { setConnected(true); console.log('Connected:' + frame); stompClient.subscribe('/topic/callback', function (response) { showCallback(response.body); }); });
但是這時無論如何,前端都會報如下的錯誤:
failed: Unexpected response code: 200
試了很多種方法,但是都沒法兒解決問題,最終在Stack Overflow的一個回答下面的Comment里面找到答案:
將原來的URL
ws://172.18.171.167:8080/density/
改為
ws://172.18.171.167:8080/density/websocket
生效!!!
具體為什么,我也不知道。。。Orz
