Cross-origin WebSocket request к Spring-приложению

159
16 сентября 2017, 23:04

Делаю UI на React. Разрабатываю это дело через create-react-app под встроенным сервером. Вношу изменения, вижу результат на странице localhost:3000. Хотелось бы посылать WebSocket-запросы со страницы localhost:3000 на localhost:8000, где у меня запущен Spring WebSocket MessageBroker. Если копирую код с относительными путями и запускаю страницу под сервлет-контейнером, то всё работает. Но в случае, когда пытаюсь послать запрос с localhost:3000, то в консоли браузера вижу, что не получается установить соединение с сервером.

Вот мой WebSocketConfig

@Configuration
@EnableWebSocketMessageBroker
@Slf4j
@CrossOrigin
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
    }
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/good").setAllowedOrigins("*").withSockJS();
    }
}

Было бы очень удобно делать UI отдельно от Spring-приложения, но с возможностью разрабатывать React-компоненты с запросами на действующий сервер. Браузер выдаёт на

var socket = new SockJS('http://localhost:8080/good');

Вот это:

Opening Web Socket...
stomp.js:134 Web Socket Opened...
stomp.js:134 >>> CONNECT
accept-version:1.1,1.0
heart-beat:10000,10000

А сервер пишет только:

o.s.b.w.f.OrderedRequestContextFilter    : Bound request context to thread: org.apache.catalina.connector.RequestFacade@525d4c80
o.s.b.w.f.OrderedRequestContextFilter    : Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@525d4c80
Answer 1

Господа, всё получилось! Сервер был настроен корректно.

На клиенте:

При создании подключения нужно писать полный адрес endpoint'а:

const socket = new SockJS('http://localhost:8080/good');

А подписки и сообщения слать на относительные адреса:

stompClient.send("/app/good/add", {}, {description: "desc", price: 2});

Полагаю, это связано с тем, что WebSocket создаётся один раз и дальнейшая работа идёт по относительным ссылкам в рамках его endpoint

READ ALSO
Как запустить java telegram bot'a на openshift?

Как запустить java telegram bot'a на openshift?

В общем, создал бота на java, maven работает, все окНо при попытке deploy'a толку нет

262
Можете помочь? не работает калькулятор

Можете помочь? не работает калькулятор

Все id дал правильно не думаю, что проблема в этом

181
заполнение .row колонками в bootstrap

заполнение .row колонками в bootstrap

столкнулся с проблемой:

325
Через время исчезает фоновая картинка в статьях (самопоизвольно меняется url)

Через время исчезает фоновая картинка в статьях (самопоизвольно меняется url)

Вроде прописал код как положено и картинка становится на фонНо через некоторое время вместо нее образуется пустота и если смотреть через...

267