我正在使用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);
}
}