【发布时间】:2016-07-14 14:02:14
【问题描述】:
我想要什么:
- 客户端发送
GET / HTTP/1.1(没有Connection: upgrade) - 这个请求应该由RequestMappingHandlerMapping处理 - 客户端发送
Connection: upgrade连同GET请求 - 这个请求应该由ServletWebSocketHandlerRegistry处理
我的 Java 配置:
@Configuration
@EnableWebSocket
public class WebsocketConfiguration extends WebMvcConfigurationSupport
implements WebSocketConfigurer {
@Bean
WebsocketComponent wsHandler() {
return new WebsocketComponent();
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(wsHandler(), "/").setAllowedOrigins("*");
}
}
我的 webmvc 控制器:
@Controller
public class Status {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String status() {
return "OK";
}
}
问题是 - 当 MVC 控制器优先时,它总是以 HTTP 200 响应,WebSocket 处理程序从未到达。当 WebSocket 处理程序具有优先权时 - 它适用于 WebSocket 客户端,但是当我尝试 http 客户端(浏览器)时,它会以 Can "Upgrade" only to "WebSocket". 响应
是否可以用回退到我的 MVC 映射来以某种方式替换此错误页面?还有其他配置可以实现我首先描述的内容吗?
【问题讨论】:
-
确定 Spring MVC 的请求映射的优先级低于 WebSocket 映射吗?例如,您可以在
ws://localhost:8080/status上打开 Web 套接字连接吗? -
@AliDehghani 当然,websocket 连接有效,普通 http 连接无效:00:30:20 错误握手失败,由于升级标头无效:null
-
显然,您的
WebSocketHandlerMapping优先于您的RequestMappingHandlerMapping。通常情况相反,请发布更多关于您的配置的信息 -
出于好奇:你为什么要在同一个 url 上?为什么不给 websockets 一些不同的 uri?
-
@AleksandrM 1) 这就是我的遗留应用程序的工作方式,我想使用 spring-websockets 而不是手写的 websocket 服务器并与客户端保持兼容 2) 最好有更多描述性的消息和说明比神秘的
can upgrade only to websocket
标签: java spring spring-mvc spring-websocket