Этот вопрос задавался много раз, но мне не удалось найти ответ для моей ситуации с React на клиенте, используя SockJS и Spring Boot v2.2.0.RELEASE на сервере.
Просто чтобы бытьясно, я использую только Websockets!
org.springframework.boot:spring-boot-starter-websocket
Все решения, которые я нахожу, предназначены для более старых версий Spring Boot или только для Spring. Или просто для обычного Интернета.
Вот мой WebSocketConfig
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
System.out.println("WebSocketConfig.registerWebSocketHandlers");
registry.addHandler(new WebSocketHandler(), "/sockjs").setAllowedOrigins("*").withSockJS();
}
}
Когда я использую пример статической HTML-страницы + некоторый код Javascript в приложении Spring Boot, он работает нормально (исходящий из того же самого(Домен 8080), поэтому я знаю, что это проблема исключительно CORS.
Когда я запускаю пример приложения React с этим кодом:
componentDidMount() {
const url = 'http://localhost:8080/sockjs';
const options = {};
let sockjs = new SockJS(url, /*_reserved*/null, options);
sockjs.onopen = function () {
console.log('sockJS endpoint OPENED OK');
this.setState({ socket: sockjs });
};
}
Поскольку я пришел с localhost: 3000 (React dev server), он регистрирует сообщение об ошибке:
Access to XMLHttpRequest at 'http://localhost:8080/sockjs/info?t=1572983410738' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Должен ли я делать что-то большее, чем .setAllowedOrigins ("*") в моем WebSocketConfig?
Я подозреваю, что янужно настроить что-то еще, так как протокол веб-сокета начинается с обычного соединения, которое позже «обновляется» до веб-сокетов.
--- ОБНОВЛЕНИЕ --- Я пришел к выводу, что это как-то связано с библиотекой SockJS,Когда я его удаляю, вот так:
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
System.out.println("WebSocketConfig.registerWebSocketHandlers");
registry.addHandler(myHandler(), "/sockjs").setAllowedOrigins("*"); // .withSockJS();;
}
и создаю простой клиент websocket без sockjs, что-то вроде этого:
var webSocketURL = null;
webSocketURL = protocol + "://" + hostname + ":" + port + endpoint;
console.log("openWSConnection::Connecting to: " + webSocketURL);
try {
webSocket = new WebSocket(webSocketURL);
webSocket.onopen = function(openEvent) {
console.log("WebSocket OPEN: " + JSON.stringify(openEvent, null, 4));
}
, тогда он работает как положено. Когда я изменяю вызов .setAllowedOrigins, я получаю правильный результат. Я получаю 403, когда он не совпадает, и когда он совпадает, я могу открыть веб-сокет.
Теперь мне нужно выяснить, что делает sockJS, что останавливает это!