Saltar al contenido

Configure Spring Boot para redirigir 404 a una aplicación de una sola página

Solución:

Este es el ejemplo completo de Spring Boot 2.0:

@Configuration
public class WebApplicationConfig implements WebMvcConfigurer {

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


@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> containerCustomizer() {
    return container -> {
        container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,
                "/notFound"));
    };
  }

}

Esto debería funcionar: agregue una página de error para 404 que se enrute a /notFoundy reenviarlo a su SPA (asumiendo que la entrada está en /index.html):

@Configuration
public class WebApplicationConfig extends WebMvcConfigurerAdapter {

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


    @Bean
    public EmbeddedServletContainerCustomizer containerCustomizer() {
        return container -> {
            container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND,
                    "/notFound"));
        };
    }

}

En caso de que alguien se tropiece aquí buscando cómo manejar Angular / React / otras rutas y rutas en una aplicación Spring Boot, pero no siempre devuelve index.html para cualquier 404, se puede hacer en un RequestMapping de controlador Spring estándar. Esto se puede hacer sin agregar controladores de vista y / o personalizar la página de error del contenedor.

RequestMapping admite comodines, por lo que puede hacer que coincida con un conjunto de rutas bien conocidas (es decir, rutas angulares, etc.) en su aplicación y solo luego regresar index.html:

@Controller 
public class Html5PathsController { 

    @RequestMapping( method = {RequestMethod.OPTIONS, RequestMethod.GET}, path = {"/path1/**", "/path2/**", "https://foroayuda.es/"} )
    public String forwardAngularPaths() { 
        return "forward:/index.html"; 
    } 
}

Otra opción (tomada de un antiguo artículo de Spring aquí: https://spring.io/blog/2015/05/13/modularizing-the-client-angular-js-and-spring-security-part-vii) es usar una convención de nomenclatura:

@Controller 
public class Html5PathsController { 

    @RequestMapping(value = "/{[path:[^\.]*}")
    public String redirect() {
        return "forward:/index.html";
    } 
}

La configuración anterior coincidirá con todas las rutas que no contengan un punto y que aún no estén asignadas a otro controlador.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *