[英]Handle the same URL with Spring MVC RequestMappingHandlerMapping and Spring Websocket's ServletWebSocketHandlerRegistry
我想要什么:
GET / HTTP/1.1
(沒有Connection: upgrade
) - 此請求應由RequestMappingHandlerMapping
處理 Connection: upgrade
與GET請求一起Connection: upgrade
- 此請求應由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".
響應Can "Upgrade" only to "WebSocket".
是否有可能以回退方式替換此錯誤頁面到我的MVC映射? 任何其他配置,以使我先描述的?
問題是 - 當MVC控制器優先時,它總是以HTTP 200響應,從未到達WebSocket處理程序
當RequestMappingHandlerMapping
優先於WebSocketHandlerMapping
,對於它們都可以處理的端點請求(如果您只考慮URL), DispatcherServlet
會將請求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
標頭來確定滿足請求的正確處理程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.