使用spring-boot-starter-websocket打开与Websocket的连接时出现错误代码200

时间:2019-04-19 02:04:52

标签: spring spring-boot websocket websphere-liberty spring-websocket

我正在使用spring-boot-starter-websocket并尝试创建一个没有sockJS选项的websocket。我使用1.5.4.RELEASE版本。我使用“简单Websocket客户端” chrome扩展程序来测试我的websocket。我收到错误

  

失败:WebSocket握手期间出错:意外的响应代码:   200

当我尝试打开与Websocket的连接时。正在部署在Liberty服务器上。

我试图检查不同的解决方案(例如this),但是大多数解决方案都指向最后添加“ / websocket”,以解决此问题。但是,当我添加它时,出现了404错误。

我的代码:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    Logger logger = LogManager.getLogger(WebSocketConfig.class);

    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        logger.info("In WebSocketConfig, ServletServerContainerFactoryBean.. ");
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxBinaryMessageBufferSize(1024000);
        return container;
    }

    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

        logger.info("In WebSocketConfig, registerWebSocketHandlers.. ");
        registry.addHandler( notificationHandler(), "/smnotifname")
                .setAllowedOrigins("*");    // allow all origins;
    }

    /**
     * @return one notification handler bean for all WebSocket connections.
     */
    @Bean
    public WebSocketHandler notificationHandler() {
        logger.info("In WebSocketConfig, notificationHandler.. ");
        return new NotificationHandler();
    }

}

服务器启动时,我可以看到所有3条记录器语句,其中显示了所有3种打印方法。

这是我的NotificationHandler类。

public class NotificationHandler extends TextWebSocketHandler {

    Logger logger = LogManager.getLogger(NotificationHandler.class);


    @Override
    public void afterConnectionEstablished(WebSocketSession session)
            throws IOException {
        logger.info("In NotificationHandler, afterConnectionEstablished.. ");
        session.sendMessage(new TextMessage("Hello !"));
    }

    @Override
    public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
        logger.info("In NotificationHandler, handleTextMessage.. ");
        session.sendMessage(new TextMessage("Hello Text Message!"));
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
        logger.info("In NotificationHandler, afterConnectionClosed.. ");
    }

}

当我在扩展名'Simple Web Socket Client'中使用url-wss:// serverurl / smnotifname时,出现错误'failed:WebSocket握手期间出错:意外的响应代码:200'。

我可以看到日志中打印了登录方法“ afterConnectionFounded”。

URL-wss:// <> / smnotifname / websocket给出404。我已经在代码中包含.setAllowedOrigins(“ *”)。

这是一个Spring MVC应用程序,其中包含角度代码。

有人可以帮助我解决我的问题吗?非常感谢您的帮助。

修改1-04/22

在调用http升级到websockets(路由到NotificationHandler类)之前,该过程似乎返回了200个代码。但是无法弄清楚Spring的哪个部分正在返回该响应。有人可以指导我如何进一步解决此问题吗?感谢并感谢您的帮助。

编辑2-04/22

如果我添加.addInterceptors(new UriTemplateHandshakeInterceptor());到我的registerWebSocketHandlers方法,代码如下。我尝试将返回码手动覆盖为101。在这种情况下,连接被打开,但是当我尝试在打开的通道中发送消息时,我得到了404。所以我猜想强制打开连接会抛出其他错误。因此,我确实需要首先了解阻止101响应并发送200响应代码的原因。

private class UriTemplateHandshakeInterceptor
        implements HandshakeInterceptor {

    @Override
    public boolean beforeHandshake(ServerHttpRequest request,
            ServerHttpResponse response, WebSocketHandler wsHandler,
            Map<String, Object> attributes) throws Exception {

        logger.info("In WebSocketConfig, UriTemplateHandshakeInterceptor, HandshakeInterceptor.. ");
        /* Retrieve original HTTP request */
        HttpServletRequest origRequest =
                ((ServletServerHttpRequest) request).getServletRequest();

        /* Retrieve template variables */
        Map<String, String> uriTemplateVars =
                (Map<String, String>) origRequest
                    .getAttribute(
                        HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);

        /* Put template variables into WebSocket session attributes */
        if (uriTemplateVars != null) {
            attributes.putAll(uriTemplateVars);
        }
        logger.info("In WebSocketConfig, UriTemplateHandshakeInterceptor, HandshakeInterceptor End.. ");

        return true;
    }

    @Override
    public void afterHandshake(ServerHttpRequest request,
            ServerHttpResponse response, WebSocketHandler wsHandler,
            Exception exception) {
        logger.info("In WebSocketConfig, afterHandshake.. ");
        response.setStatusCode(HttpStatus.SWITCHING_PROTOCOLS); 
    }
}

0 个答案:

没有答案