В настоящее время я внедряю приложение Spring Boot с интерфейсом SPA React. Для маршрутизации каждого запроса, который точно не сопоставлен с маршрутом, я использую следующий контроллер для пересылки запросов в мое приложение React (как показано здесь: https://stackoverflow.com/a/40769350/4454752 с небольшим изменением, чтобы также поддерживать не сопоставленные запросы к URL-адресу форма /a/b/c/...):
@Controller
public class BaseController {
private static final Logger LOGGER = LogManager.getLogger(BaseController.class);
// Match everything without a suffix (so not a static resource)
@RequestMapping(value = "/**/{[path:[^\\.]*}")
public String redirect() {
LOGGER.info("Redirect request to React app");
// Forward to home page so that route is preserved.
return "forward:/";
}
}
В дополнение к этому я хочу иметь простой маршрут Websocket в /socket
, который обрабатывает как текстовые, так и двоичные сообщения Websocket. Я не хочу использовать протокол STOMP
на этой конечной точке.
Я настроил свои веб-сокеты так:
@Configuration
@EnableWebSocket
@CrossOrigin(origins = "*")
public class WebSocketConfiguration implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new MyWebsocketHandler(), "/socket").setAllowedOrigins("*").withSockJS();
}
}
Проблема, с которой я столкнулся, заключается в том, что запросы Websocket, отправляемые на конечную точку /socket
, сопоставляются с BaseController#redirect()
, и поэтому клиент Websocket не получает действительное соединение.
У меня вопрос: как я могу исключить маршрут /socket
из правила отображения BaseController
? Я думал, что если маршрут уже нанесен на карту, он не получит BaseController
. Или мне нужно каким-то образом снизить приоритет BaseController
?
Если кто-нибудь знает метод, как это сделать, я был бы очень счастлив.
Заранее спасибо :)