Веб-сокеты с использованием политики SockJS to Spring Boot 2.2.0 CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin» - PullRequest
0 голосов
/ 05 ноября 2019

Этот вопрос задавался много раз, но мне не удалось найти ответ для моей ситуации с 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, что останавливает это!

...