tomcat7 spring boot应用程序中的websockets

Posted

技术标签:

【中文标题】tomcat7 spring boot应用程序中的websockets【英文标题】:websockets in tomcat7 spring boot app 【发布时间】:2017-06-21 12:45:42 【问题描述】:

我有一个要部署到 tomcat 7.0.78 实例的 Spring Boot War 文件。网络应用程序启动正常,但网络套接字不工作。它们在嵌入式 tomcat 环境中运行良好,例如运行./gradlew bootRun

我在 Chrome 控制台中遇到的错误是:

angular.js:14525 Possibly unhandled rejection: Whoops! Lost connection to http://localhost:8080/websock

我尝试将tomcat连接器设置为使用Http11NioProtocol,但似乎没有效果。

    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
       connectionTimeout="20000"
       redirectPort="8443" />      

我也试过设置成ROOT.war,然后浏览显示:WebSocket connection to 'ws://localhost:8080/websock/424/wzkek0zw/websocket' failed: Error during WebSocket handshake: Unexpected response code: 500.

我缺少正确启用 websockets 的 tomcat 配置文件中的某些内容吗?我的网络套接字配置类如下所示:

@Configuration
@EnableWebSocketMessageBroker
@EnableWebSocket
public class WebSocketConfiguration  extends AbstractWebSocketMessageBrokerConfigurer 


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

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

我没有编辑 web.xml 中的任何内容,只更改了 server.xml 中的连接器协议。

更新: 我的部分问题是我的连接尝试前面有一个斜线,例如 $stomp.connect('/websock'),所以我把它改成了 $stomp.connect('websock')。这在 tomcat 的 windows 安装上工作正常,但在 ubuntu 安装上不起作用。我必须在我的 javascript 中明确告诉它连接到 http://localhost:8080/websock,但随后在尝试连接到 Web 套接字时出现错误:

webSocket connection to 'ws://localhost:8080/websock/940/qdb1xkkp/websocket' failed: Error during WebSocket handshake: Unexpected response code: 404

【问题讨论】:

查找我发现的堆栈跟踪:***.com/a/23546192/592355 ...听起来很可能是org.apache.tomcat.websocketjavax.websocket之间的版本/实现冲突 你是对的。我曾尝试添加 javax.websocket,但它导致了更多问题。部分问题是连接时我的路径错误,但我仍然遇到问题。现在更新答案。 【参考方案1】:

我的问题是,在通过 stomp 连接到套接字之前,我必须正确获取基本 URL:

var getUrl = window.location;
var baseUrl = getUrl .protocol + "//" + getUrl.host + "/" + getUrl.pathname.split('/')[1];
$stomp.connect(baseUrl + '/websock', )

【讨论】:

以上是关于tomcat7 spring boot应用程序中的websockets的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Tomcat部署不起作用Tomcat 7

使用 JPA 进行 Spring Boot 数据源配置 [关闭]

Spring Boot:在 Tomcat 7 上部署 WAR

在 Tomcat 6 中部署 Spring Boot 应用程序(传统部署)

在 tomcat 上部署 Spring Boot WAR 文件显示错误 404

Spring boot demo: spring boot生成war包