处理与Spring MVC RequestMappingHandlerMapping和Spring的WebSocket的ServletWebSocketHandlerRegistry相同的URL
什么我想有:处理与Spring MVC RequestMappingHandlerMapping和Spring的WebSocket的ServletWebSocketHandlerRegistry相同的URL
- 客户端发送
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映射?任何其他配置,使我所描述的第一?
的问题是 - 当MVC控制器采取优先次序,它总是 与HTTP 200响应,WebSocket的处理器从未达到
当RequestMappingHandlerMapping
优先WebSocketHandlerMapping
,对于一个请求到两个端点他们可以处理(如果您只是考虑URL),DispatcherServlet
会将请求发送到@RequestMapping
方法,而不是WebSocket处理程序。为了解决这一问题,限制@RequestMapping
方法只是服务于请求而不Connection:Upgrade
头:
@Controller
public class Status {
@RequestMapping(value = "/", method = GET, headers = "Connection!=Upgrade")
public String status() {
return "OK";
}
}
这样,当DispatcherServlet
搜索该共同端点的处理程序,这将考虑Connection:Upgrade
的存在或不存在头来确定正确的处理程序来完成请求。
太棒了,它的工作原理! – vitalyster
确实Spring MVC的请求映射的优先级低于WebSocket映射吗?例如,你可以在'ws:// localhost:8080/status'上打开一个web套接字连接吗? –
@AliDehghani肯定,WebSocket连接的工作原理,普通HTTP连接没有工作与: 〇时30分20秒ERROR握手失败由于无效的升级头:空 – vitalyster
显然,你的'WebSocketHandlerMapping'有超过你的'RequestMappingHandlerMapping'更优先。这通常是相反的方式,请发布更多关于你的配置 –