带有Spring Boot的SPA - 为非API请求提供index.html

时间:2016-08-18 11:08:22

标签: spring spring-mvc spring-boot single-page-application

我目前正在开发一个应该使用单页React前端的网页。对于后端,我正在使用spring boot框架。

所有api调用都应使用前缀为/api的url,并应由REST控制器处理。

所有其他网址应该只提供index.html文件。我怎么用春天来实现这个目标?

1 个答案:

答案 0 :(得分:5)

实现您想要的最简单方法是实现自定义404处理程序。

将这些参数添加到您的application.properties:

spring.resources.add-mappings=false
spring.mvc.throw-exception-if-no-handler-found=true

第一个属性删除所有默认的静态资源处理,第二个属性禁用Spring的默认whitelabel页面(默认情况下Spring捕获NoHandlerFoundException并提供标准的whitelabel页面)

将404处理程序添加到您的应用程序上下文中:

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.NoHandlerFoundException;
import javax.servlet.http.HttpServletRequest;

@ControllerAdvice
public class PageNotFoundController {
    @ExceptionHandler(NoHandlerFoundException.class)
    public String handleError404() {
            return "redirect:/index.html";
    }
}

最后,您需要添加自定义视图解析程序以提供静态内容(在本例中为index.html)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceView;
import org.springframework.web.servlet.view.UrlBasedViewResolver;

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/index.html").addResourceLocations("classpath:/static/index.html");
        super.addResourceHandlers(registry);
    }

    @Bean
    public ViewResolver viewResolver() {
        UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
        viewResolver.setViewClass(InternalResourceView.class);
        return viewResolver;
    }

}

您的index.html应放在/resources/static/目录中。