【问题标题】:Spring 4 websocket without STOMP,socketjs没有STOMP,socketjs的Spring 4 websocket
【发布时间】:2015-11-22 21:03:04
【问题描述】:

我正在尝试在不使用 socketjs 库的情况下测试 websocket,而且我不想添加任何 stomp 连接。

我正在关注 * 问题中的示例: WebSocket with Sockjs & Spring 4 but without Stomp

所以在没有 stomp 服务器的情况下,我已经成功地通过 socketjs 库连接了一个 url:ws://localhost:8080/greeting/741/0tb5jpyi/websocket

现在我想删除socketjs库以允许原始websocket连接(可能是android,ios等设备......)

当我删除参数:.withSockJS() 时,我无法通过 websocket 连接。

我尝试了以下网址,但它们不起作用:

ws://localhost:8080/greeting/394/0d7xi9e1/websocket not worked
ws://localhost:8080/greeting/websocket not worked
ws://localhost:8080/greeting/ not worked 

我应该使用哪个 URL 来连接?

【问题讨论】:

  • 您是如何管理对 tomcat 的升级请求,表明“将协议形式从 http 更新为 ws”

标签: spring websocket stomp spring-4 spring-websocket


【解决方案1】:

我也遇到客户端客户端无法连接到服务器的相同情况。

我的工作是将波纹管setAllowedOrigins("*") 添加到自定义处理程序。

registry.addHandler(webSocketHandler, "/app").setAllowedOrigins("*");

【讨论】:

    【解决方案2】:

    你应该使用ws://localhost:8080/greeting:

    new WebSocket('ws://localhost:8080/greeting')
    

    【讨论】:

    • 它使用 javascript 但使用高级休息客户端,我收到 403 禁止错误。
    • 默认行为是只接受同源请求,使用 Advanced Rest Client 时可能会出现 403。在端点上配置允许的来源:registry.addHandler(greetingHandler(), "/greeting").setAllowedOrigins("*");
    • 如何安全地配置 WebSocketConfigurer,我的意思是像 new WebSocket('wss://localhost:8080/greeting') 这样的东西。我不想使用 stomp/sockjs,因为客户端是我无法控制的第三方,我唯一的选择是纯 TextWebSocketHandler
    • @Chakri 为了配置 websocket 的安全性,您只需在 spring 小瓶属性 server.ssl.enabled=true 中激活 ssl 模式,完整的配置可以在链接中找到:baeldung.com/spring-boot-https-self-signed-certificate
    【解决方案3】:

    我在我的项目中使用没有 STOMP 的 websockets。

    以下配置适用于spring-boot

    pom.xml

    中添加spring boot websocket依赖
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId>
        <version>${spring-boot.version}</version>
    </dependency>
    

    然后添加一个类(这里是WebSocketServerConfiguration.java),它配置你的websocket:

    @Configuration
    @EnableWebSocket
    public class WebSocketServerConfiguration implements WebSocketConfigurer {
    
        @Autowired
        protected MyWebSocketHandler webSocketHandler;
    
        @Override
        public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            registry.addHandler(webSocketHandler, "/as");
        }
    }
    

    你终于可以编写你的WebsocketHandler了。 Spring 为 WebSocketHandlers 提供了不同的抽象类(在主包中:org.springframework.web.socket.handler)。我的 websocket 配置为没有STOMP,我的客户端不使用socket.js。因此MyWebSocketHandler 扩展了 TextWebSocketHandler 并覆盖了错误、打开和关闭连接以及接收文本的方法。

    @Component
    public class MyWebSocketHandler extends TextWebSocketHandler {
        ...
    
        @Override
        public void handleTransportError(WebSocketSession session, Throwable throwable) throws Exception {
            LOG.error("error occured at sender " + session, throwable);
            ...
        }
    
        @Override
        public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
            LOG.info(String.format("Session %s closed because of %s", session.getId(), status.getReason()));
    
            ...
        }
    
        @Override
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            LOG.info("Connected ... " + session.getId());
    
            ...
        }
    
        @Override
        protected void handleTextMessage(WebSocketSession session, TextMessage jsonTextMessage) throws Exception {
            LOG.debug("message received: " + jsonTextMessage.getPayload());
            ...
        }
    }
    

    【讨论】:

    • 感谢duffy356的回复,我的配置一样。我正在尝试通过 chrome 高级休息客户端插件测试我的连接。在我之前的项目中,我能够通过该插件连接 websocket。但是该项目不是基于弹簧的。现在我无法通过 url 连接 websocket:ws://localhost:8080/greeting/。我找不到正确的 url 来连接。有什么想法吗?
    • chrome高级rest客户端插件是否支持websockets?
    • 尝试从 chrome 控制台连接到您的服务器。
    • @duffy356 感谢您的回答。是否可以通过 ssl (wss) 使没有 STOMP 的 websockets 工作?
    • @rvit34 为了安全地配置 websocket,您只需在 spring 小瓶属性 server.ssl.enabled=true 中激活 ssl 模式,完整的配置可以在链接中找到:baeldung.com/spring-boot -https-self-signed-certificate