簡體   English   中英

使用Spring MVC RequestMappingHandlerMapping和Spring Websocket的ServletWebSocketHandlerRegistry處理相同的URL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM