处理与Spring MVC RequestMappingHandlerMapping和Spring的WebSocket的ServletWebSocketHandlerRegistry相同的URL

处理与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映射?任何其他配置,使我所描述的第一?

+0

确实Spring MVC的请求映射的优先级低于WebSocket映射吗?例如,你可以在'ws:// localhost:8080/status'上打开一个web套接字连接吗? –

+0

@AliDehghani肯定,WebSocket连接的工作原理,普通HTTP连接没有工作与: 〇时30分20秒ERROR握手失败由于无效的升级头:空 – vitalyster

+0

显然,你的'WebSocketHandlerMapping'有超过你的'RequestMappingHandlerMapping'更优先。这通常是相反的方式,请发布更多关于你的配置 –

的问题是 - 当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的存在或不存在头来确定正确的处理程序来完成请求。

+1

太棒了,它的工作原理! – vitalyster