Windows Server 2012, Apache Tomcat, Spring MVC: подключение через веб-сокет заблокировано для внешнего IP-адреса

Мы развернули наше веб-приложение Spring MVC на Windows Server 2012. Наше веб-приложение использует Spring Websockets для обновлений с помощью stomp.js и sock.js.

Наша конфигурация websocket:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/calcApp");
    }

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

}

Websocket работает на localhost, а журналы следующие:

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

<<< CONNECTED
version:1.1
heart-beat:0,0
user-name:admin

connected to server undefined

>>> SUBSCRIBE
id:sub-0
destination:/topic/resident

...

Как ни странно, это не работает, когда я ввожу внешний IP, на той же машине и в браузере:

Opening Web Socket...
WebSocket connection to 'ws://192.168.5.50:8080/autopark/add/629/i148hb1c/websocket' failed: WebSocket is closed before the connection is established.
Whoops! Lost connection to undefined

Мы подумали, что для внешнего доступа есть какой-то брандмауэр, и полностью его отключили:

введите здесь описание изображения

Но это не решило нашу проблему.


Как мы можем решить эту проблему?


person nurgasemetey    schedule 13.04.2017    source источник
comment
Используйте трассировщик пакетов (например, wireshark), чтобы увидеть сетевой трафик. Это часто дает очень полезную подсказку о том, почему соединение не удалось.   -  person John Hascall    schedule 15.04.2017
comment
@JohnHascall на самом деле это может сработать   -  person nurgasemetey    schedule 16.04.2017


Ответы (2)


Я не совсем уверен и не эксперт по весне.

но, похоже, вам нужно вызывать сервер по доменному имени по его ip-адресу, что логично.

Поскольку ip будет использоваться более чем для одного домена, кажется, что контекст должен знать, какой контекст следует вызывать (даже если он один) в контексте весны.

другими словами, вызов контекста по ip приведет к путанице контекста Spring для выбора/вызова контекста/домена, поэтому он отказывается от соединения.

попробуйте, привяжите 192.168.5.50 к доменному имени, затем попробуйте вызвать путь, используя домен (не ip). Надеюсь, это работает таким образом.

person Community    schedule 15.04.2017

Первым шагом в отладке будет проверка того, что ваш сервер приложений действительно прослушивает внешний интерфейс.

Вы можете проверить, к какому IP-адресу привязан ваш контейнер, просмотрев 8080 записей в выводе netstat.

Следующим шагом должна быть проверка того, что внешний компьютер может «видеть» порт на внешнем IP-адресе. Это можно сделать разными способами, но достаточно использовать команду telnet.

  • telnet 192.168.5.50 8080
    • If this does not work, then we know there is something blocking communication between the two applications

Если мы дойдем до этого момента, то, скорее всего, проблема с конфигурацией самого приложения.

person jsorah    schedule 22.04.2017