Windows Server 2012,Apache Tomcat,Spring MVC:阻止外部IP的Websocket连接

时间:2017-04-13 15:10:24

标签: java spring spring-mvc tomcat windows-server

我们在 Windows Server 2012 上部署了 Spring MVC Web应用程序。我们的网络应用程序使用 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

我们认为对于外部访问,有一些防火墙并完全禁用它:

enter image description here

但它并没有解决我们的问题。

我们如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我不太确定,也不是春天专家。

但似乎你需要通过ip addr通过域名调用服务器,这是合乎逻辑的。

由于ip将用于多个域,因此上下文似乎需要知道在spring上下文中应该调用哪个上下文(即使是一个)。

换句话说,通过ip调用上下文会混淆spring上下文来选择/调用哪个上下文/域,因此它会拒绝连接。

有atry,将192.168.5.50 binf到域名,然后尝试使用域(而不是ip)调用路径。希望它以这种方式工作。

答案 1 :(得分:0)

调试此操作的第一步是验证应用程序服务器是否实际侦听外部接口。

您可以通过在netstat的输出中查找8080个条目来验证容器绑定的IP。

下一步应该是验证外部计算机可以&#34;参见&#34;外部IP上的端口。有多种方法可以做到这一点,但使用telnet命令就足够了。

  • telnet 192.168.5.50 8080
    • 如果这不起作用,那么我们知道两个应用程序之间存在阻塞通信的问题

如果我们达到这一点,那么应用程序本身的配置可能存在问题。