配置spring boot以将404重定向到单个页面应用程序

Vov*_*van 9 spring spring-mvc single-page-application spring-boot

我想配置我的Spring Boot应用程序,将任何404未找到的请求重定向到我的单页应用程序.

例如,如果我正在调用localhost:8080/asdasd/asdasdasd/asdasd哪个不存在,则应该重定向到localhost:8080/notFound.

问题是我有一个单页反应应用程序,它在根路径中运行localhost:8080/.所以春天应该重定向到localhost:8080/notFound然后前进/(保持路线).

Ral*_*ert 18

这应该可以解决这个问题:添加404路由到的错误页面/notFound,并将其转发到SPA(假设该条目已启用/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"));
        };
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 在Spring Boot V2(目前正在开发2.0.0.M7)中,“ EmbeddedServletContainerCustomizer”已更改为“ WebServerFactoryCustomizer”。bean`containerCustomizer`的签名将是`WebServerFactoryCustomizer <ConfigurableServletWebServerFactory>`。 (4认同)
  • 在Spring Boot 2.0.2.RELEASE`container.addErrorPages`中不是有效的方法 (3认同)

小智 15

这是完整的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"));
    };
  }

}
Run Code Online (Sandbox Code Playgroud)


joe*_*son 5

如果有人在这里绊倒寻找如何在Spring Boot应用程序中处理Angular / React /其他路线和路径-但并非总是返回任何404的index.html-可以在标准Spring控制器RequestMapping中完成。无需添加视图控制器和/或自定义容器错误页面即可完成此操作。

RequestMapping支持通配符,因此您可以使其与应用程序中的一组众所周知的路径(即角度路线等)匹配,然后才返回正向index.html:

@Controller 
public class Html5PathsController { 

    @RequestMapping( method = {RequestMethod.OPTIONS, RequestMethod.GET}, path = {"/path1/**", "/path2/**", "/"} )
    public String forwardAngularPaths() { 
        return "forward:/index.html"; 
    } 
}
Run Code Online (Sandbox Code Playgroud)

另一个选择是使用(从Spring的旧文章中借来的:https : //spring.io/blog/2015/05/13/modularizing-the-client-angular-js-and-spring-security-part-vii)命名约定:

@Controller 
public class Html5PathsController { 

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

上面的配置将匹配所有不包含句点并且尚未映射到另一个控制器的路径。

  • 要修复嵌套路径的解决方案,您可以使用类似 `@RequestMapping({ "/{path:[^\\.]*}", "/{path1:[^\\.]*}/{path2:[ ^\\.]*}", ..., "/{path1:[^\\.]*}/{path2:[^\\.]*}/{path3:[^\\.]*} /{path4:[^\\.]*}/{path5:[^\\.]*}"})` (2认同)