Spring Webflux, Как перенаправить на index.html для обслуживания статического контента

spring-boot-starter-webflux (Spring Boot v2.0.0.M2) уже настроен, как в spring-boot-starter-web, для обслуживания статического содержимого в статической папке в ресурсах. Но он не пересылает index.html. В Spring MVC можно настроить так:

@Override
public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("forward:/index.html");
}

Как это сделать в Spring Webflux?


person Igor Rybak    schedule 17.07.2017    source источник


Ответы (4)


Сделайте это в WebFilter:

@Component
public class CustomWebFilter implements WebFilter {
  @Override
  public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    if (exchange.getRequest().getURI().getPath().equals("/")) {
        return chain.filter(exchange.mutate().request(exchange.getRequest().mutate().path("/index.html").build()).build());
    }

    return chain.filter(exchange);
  }
}
person Alphaone    schedule 19.07.2017
comment
Это нормально, но для динамических требований это не так. - person kakabali; 18.05.2020
comment
@kakabali зависит от того, что вы имеете в виду «динамический», но он отлично работает, например, с /blog/{id}/comments (это динамический маршрут). - person Chris Turner; 19.08.2020

Для этого есть билет в трекере Spring Boot.

person Brian Clozel    schedule 19.07.2017

То же самое при использовании WebFlux Kotlin DSL:

@Bean
open fun indexRouter(): RouterFunction<ServerResponse> {
    val redirectToIndex =
            ServerResponse
                    .temporaryRedirect(URI("/index.html"))
                    .build()

    return router {
        GET("/") {
            redirectToIndex // also you can create request here
        }
    }
}
person Manushin Igor    schedule 03.04.2019
comment
Как мне сделать это путем пересылки вместо переадресации? - person lfmunoz; 01.06.2020
comment
@lfmunoz, я не нашел статус Forward http. Наверное, есть встроенная функция. Однако вы можете создать свой собственный ответ, используя такую ​​конструкцию: ServerResponse .status(HttpStatus.I_AM_A_TEAPOT) .header("my-header", "2342"), просто поместите туда правильный статус и правильные заголовки - person Manushin Igor; 01.06.2020

person    schedule
comment
Этот был лучше фильтров - person kakabali; 18.05.2020
comment
Спасибо, это был последний кусочек пазла. - person Kirill Kazoolin; 24.06.2020