Сбой соединения с веб-сокетами в Pivotal Cloud, но работает на локальном хосте

У меня есть веб-сервис на основе Java Spring Boot под названием cde-service и внешний интерфейс на основе Angular 5 под названием abc-app.

abc-app использует соединение через веб-сокет для отправки данных регистрации в cde-service, которая, в свою очередь, что-то делает с данными журнала на стороне клиента.

Я протестировал приложения на локальном хосте, и они работают как положено.

Однако, когда я внедряю cde-service в Pivotal Cloud Foundry, соединение с веб-сокетом завершается неудачно с 403 Forbidden. Я сделал изменения, чтобы разрешить CORS.

Любые указатели относительно того, почему это происходит, были бы действительно полезны.

cde-service:

// Snippet from the Websocket Configuration. 

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
  registry.addEndpoint("/websocketConnection").setAllowedOrigins("*").withSockJS();
}


@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {

  registry.enableSimpleBroker("/topic", "/queue");
  registry.setApplicationDestinationPrefixes("/app");
}



// Snippet from the Controller.

@MessageMapping("/logs")
public void handleLogs(LogModel logModel) {
  logService.logHandler(logModel);
}

abc-app:

var sock = new SockJS("http://host_name/websocketConnection");
var stomp = Stomp.over(sock);

stomp.connect('guest', 'guest', function(frame) {
  console.log('----    Established Connection  ----');
});

stomp.send("/app/logs", {},
  JSON.stringify({
    'logData': 'Some Data'
  }));

1 ответ

Решение

Однако, когда я внедряю cde-service в Pivotal Cloud Foundry, соединение с веб-сокетом завершается неудачно с 403 Forbidden. Я сделал изменения, чтобы разрешить CORS.

Cloud Foundry не добавляет никаких условий для использования WebSockets в вашем приложении. Стандартный клиент браузера должен работать нормально. В этом случае ваше клиентское приложение пытается подключиться к вашему серверному приложению, а ваше серверное приложение возвращает 403. Единственный способ выяснить, почему нужно отладить ваше серверное приложение и увидеть, почему он говорит, что соединение WebSocket запрещено.

Платформа не будет генерировать 403.

Для меня CORS является наиболее вероятным виновником, но здесь отнюдь не достаточно информации, чтобы я мог принять такое решение, и это могут быть и другие вещи. Увеличьте уровни журналов в своем приложении и посмотрите, что происходит. Кроме того, попробуйте выполнить локальное тестирование, но с использованием нескольких доменов, так что вам действительно придется иметь дело с CORS.

Единственное, на что следует обратить внимание: некоторые установки Cloud Foundry требуют, чтобы ваши соединения WebSocket проходили через другой порт. Это не ограничение Cloud Foundry, а балансировщик нагрузки, используемый оператором вашей платформы. В некоторых случаях, например при работе в AWS, балансировщики нагрузки (ELB, кашель) не поддерживают передачу трафика HTTP, HTTPS и WebSockets через один и тот же порт. Чтобы обойти это ограничение балансировки нагрузки, операторы будут иметь отдельные порты для каждого протокола, то есть HTTP -> 80, HTTPS 443, WSS 4443. Узнайте у своего оператора платформы, как развернута ваша среда.

Другие вопросы по тегам