我想要拥有什么:
- 客户端发送
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 处理程序从未到达
When RequestMappingHandlerMapping
优先于WebSocketHandlerMapping
,对于两者都可以处理的端点的请求(如果您只考虑 URL),DispatcherServlet
会将请求发送至@RequestMapping
方法,而不是 WebSocket 处理程序。为了解决这个问题,限制@RequestMapping
只提供请求的方法,无需Connection:Upgrade
header:
@Controller
public class Status {
@RequestMapping(value = "/", method = GET, headers = "Connection!=Upgrade")
public String status() {
return "OK";
}
}
这样,当DispatcherServlet
搜索该公共端点的处理程序,它会考虑是否存在Connection:Upgrade
header 来确定正确的处理程序来满足请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)