gpt4 book ai didi

java - 使用 Spring MVC RequestMappingHandlerMapping 和 Spring Websocket 的 ServletWebSocketHandlerRegistry 处理相同的 URL

转载 作者:IT老高 更新时间:2023-10-28 13:59:28 25 4
gpt4 key购买 nike

我想要什么:

  • 客户端发送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 :

@Controller
public class Status {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String status() {
return "OK";
}
}

问题是 - 当 MVC Controller 优先时,它总是以 HTTP 200 响应,WebSocket 处理程序从未到达。当 WebSocket 处理程序具有优先级时 - 它适用于 WebSocket 客户端,但是当我尝试 http 客户端(浏览器)时,它会响应 Can "Upgrade"only to "WebSocket".是否可以用回退到我的 MVC 映射来以某种方式替换此错误页面?还有其他配置可以实现我首先描述的内容吗?

最佳答案

The problem is - when MVC controller taking precedence, it always respond with HTTP 200, WebSocket handler never reached

RequestMappingHandlerMapping 优先于 WebSocketHandlerMapping 时,对于他们都可以处理的端点的请求(如果您只考虑 URL),DispatcherServlet 会将请求分派(dispatch)给 @RequestMapping 方法,而不是 WebSocket 处理程序。为了解决这个问题,限制 @RequestMapping 方法只服务于没有 Connection:Upgrade header 的请求:

@Controller
public class Status {
@RequestMapping(value = "/", method = GET, headers = "Connection!=Upgrade")
public String status() {
return "OK";
}
}

这样,当 DispatcherServlet 搜索该公共(public)端点的处理程序时,它会考虑 Connection:Upgrade header 的存在与否来确定正确的处理程序完成请求。

关于java - 使用 Spring MVC RequestMappingHandlerMapping 和 Spring Websocket 的 ServletWebSocketHandlerRegistry 处理相同的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38376316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com