Spring 4无需STOMP的websocket,socketjs

18

我想测试websocket,但不想使用socketjs库也不想添加任何stomp连接。

我正在遵循stackoverflow问题的示例: WebSocket with Sockjs & Spring 4 but without Stomp

所以在没有stomp服务器的情况下,我已经成功通过socketjs库使用以下URL进行连接:ws://localhost:8080/greeting/741/0tb5jpyi/websocket

现在我想移除socketjs库以允许原始websocket连接(例如:Android、iOS等设备)。

当我删除参数:.withSockJS()时,我无法通过websocket连接。我尝试了以下URL,但它们都不起作用:

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

我应该使用哪个网址进行连接?


你是如何处理Tomcat的升级请求并指示“将协议从HTTP更新为WS”的呢? - Bilbo Baggins
3个回答

18

我在项目中使用不带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高级REST客户端插件测试我的连接。在我的上一个项目中,我能够通过该插件连接WebSocket。但是该项目不是基于Spring的。现在我无法通过url:ws://localhost:8080/greeting/连接WebSocket。我找不到正确的连接URL。有任何想法吗? - melihcoskun
Chrome高级REST客户端插件是否支持WebSockets? - duffy356
尝试从Chrome控制台连接到您的服务器。 - duffy356
1
@duffy356 谢谢你的回答。是否有可能通过 SSL(wss)使 WebSockets 在没有 STOMP 的情况下工作? - rvit34
1
为了通过安全方式配置websocket,您应该在Spring框架中通过属性server.ssl.enabled=true启用SSL模式。完整的配置可以在链接baeldung.com/spring-boot-https-self-signed-certificate找到。 - Yassir Khaldi
显示剩余3条评论

8

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

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

它在JavaScript中可以工作,但是在高级REST客户端中,我收到了403禁止错误。 - melihcoskun
1
默认行为是仅接受相同来源的请求,这可能会在使用高级 REST 客户端时导致 403 错误。请在您的端点上配置允许的来源:registry.addHandler(greetingHandler(), "/greeting").setAllowedOrigins("*"); - Sergi Almar
如何在WebSocketConfigurer中添加安全配置,例如:new WebSocket('wss://localhost:8080/greeting')。由于客户端是第三方的,我无法对stomp/sockjs进行控制,所以我只能使用纯TextWebSocketHandler。 - Chakradhar K
@Chakri 为了配置带有安全性的WebSocket,您只需通过属性server.ssl.enabled=true在Spring中激活ssl模式即可。完整的配置可以在以下链接中找到:https://www.baeldung.com/spring-boot-https-self-signed-certificate - Yassir Khaldi

3

我也面临着客户端无法连接服务器的情况。

对我有用的是在自定义处理程序中添加以下内容setAllowedOrigins("*")

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

经过数小时的尝试和错误,这对我来说解决了问题。谢谢! - Nexonus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接