无法通过 Chrome 扩展连接到使用 Spring 创建的简单 websocket 服务器

Posted

技术标签:

【中文标题】无法通过 Chrome 扩展连接到使用 Spring 创建的简单 websocket 服务器【英文标题】:Cannot connect to a simple websocket server, created with Spring, through Chrome extension 【发布时间】:2020-01-21 14:31:47 【问题描述】:

这里是 WebSocket 服务器的三个简单组件,在 Spring 上创建

Spring Boot 应用

package test.andrew;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application 

    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    

Websocket 服务器配置文件

package test.andrew;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer 

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) 
        registry.addHandler(new SocketTextHandler(), "/name");
    


还有一个 Socket 文本处理程序类

package test.andrew;

import org.springframework.stereotype.Component;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.io.IOException;

@Component
public class SocketTextHandler extends TextWebSocketHandler 

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message)
            throws InterruptedException, IOException 

        session.sendMessage(new TextMessage("Pong"));
    

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception 
        session.sendMessage(new TextMessage("Connection established"));
    

我的问题是服务器无法正常工作,例如,在使用普通的旧 javax.websocket 时 我无法通过 Smart Websocket Client Chrome 扩展建立连接,因此无法继续向 wss 发送消息。

感谢您的帮助或建议!

【问题讨论】:

请在上述类中包含包声明。 @M.Deinum,完成 你能解释一下什么不起作用吗?你看到端点被注册了吗? 是的,端点已注册。我对 wss 的期望是能够从一个简单的 chrome 客户端连接和发送消息,它是如何与 javax websockets 一起工作的 有什么解决方案吗? 【参考方案1】:

我通过修改 WebSocketConfig 类解决了这个问题:

package test.andrew;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;


@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer 

@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) 
    registry.addHandler(new SocketTextHandler(), "/name").setAllowedOrigins("*");


请注意调用了 .setAllowedOrigins("*") 方法。在allow origins之后,我们可以通过chrome扩展调用这个web socket url。

如果您使用的是 spring security,那么在 spring security 配置文件中允许这个 url。

【讨论】:

以上是关于无法通过 Chrome 扩展连接到使用 Spring 创建的简单 websocket 服务器的主要内容,如果未能解决你的问题,请参考以下文章

为什么无法通过Google Cloud Platform上的Chrome RDP连接到Windows VM?

VS 代码无法连接到 Chrome 调试端口:37095

Chrome 无法连接到 websocket 服务器(操作码 -1)“握手被取消”

使用 SetExperimentalOption debuggerAddress 作为 localhost:22020 时无法在 localhost:22020 处连接到 chrome

OSX:Chrome 无法连接到 .localhost-domains。拒绝连接

chrome驱动程序:已断开连接:无法连接到渲染器