Я интегрирую одностраничное приложение в проект Spring Boot. Контекст пользовательского интерфейса (SPA): http://localhost:8080/ui/
Контекст самого приложения Spring Boot: http://localhost:8080/. Контроллеры имеют другой контекст, который не имеет ничего общего с контекстом пользовательского интерфейса.
В одном случае пользовательский интерфейс меняет адресную строку браузера на URL, о котором сервер не знает, но не отправляет запрос на сервер. После такой вещи, если я обновлю страницу, сервер ответит 404. Однако мне нужно вернуть страницу index.html по умолчанию.
Пример: я перехожу на http://localhost:8080/ui/, Интерфейс изменяет это на http://localhost:8080/ui/mainpage. Я обновляю страницу и получаю 404.
Я нашел похожий вопрос , но я бы хотел сделать это немного по-другому, затем ответил там.
Мне нужно вернуть ресурс по умолчанию (index.html), когда есть запрос на http://localhost:8080/ui/**,, если запрос сделан на http://localhost:8080/context1/blablabla, Я хотел бы вернуть 404.
После отладки и поиска в Google, я пришел к следующему решению:
@Configuration
public static class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/ui/**")
.addResourceLocations("/ui/")
.resourceChain(false)
.addResolver(new PathResourceResolver() {
@Override
protected Resource getResource(String resourcePath, Resource location) throws IOException {
Resource resource = super.getResource(resourcePath, location);
return Objects.isNull(resource) ? super.getResource("index.html", location) : resource;
}
});
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/ui/").setViewName("index.html");
}
}
Подход здесь заключается в том, чтобы вручную добавить PathResourceResolve и переопределить его метод getResource, поэтому, когда ресурс равен нулю, вызовите ресурс index.html. Таким образом, я могу быть уверен, что я верну страницу по умолчанию только тогда, когда будет сделан запрос к http://localhost:8080/ui/**, а все остальные запросы вернутся как обычно 404.
Я не думаю, что это правильное решение, для меня это выглядит как взломать. Я подумал, что, возможно, у обработчиков ресурсов есть какой-то конфиг, такой как ресурс по умолчанию, но я ничего не нашел по этому поводу.
У меня вопрос, как это сделать правильно?
Ценю любые предложения.