springboot项目中的mvc配置大概有两种写法,一种是基于实现接口WebMvcConfigurer,一种是基于继承WebMvcConfigurationSupport,这两种写法会冲突,最终spring容器会执行继承WebMvcConfigurationSupport类中的重写方法,而忽略实现接口WebMvcConfigurer所重写的方法。
因此,一个应用中,应只选择一种方法进行配置。
如下:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
*
* 功能描述:从上到下:1.跨域支持2.配置首页3.配置静态资源访问
* @Author 李
* @MethodName corsConfigurer
* @Date 8:55 2020/10/10
* @param
* @return org.springframework.web.servlet.config.annotation.WebMvcConfigurer
* @exception
**/
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("*")
.allowedHeaders("*")
.allowedOrigins("*")
.allowCredentials(true)
.exposedHeaders(HttpHeaders.SET_COOKIE).maxAge(18000L);
}
@Override
public void addViewControllers(ViewControllerRegistry registry){
registry.addViewController("/").setViewName("index");
registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/static/**")
.addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/META-INF/resources/webjars/");
}
};
}
}
关于静态资源访问,如果是纯前后端分离的项目,则不需要,此处是因为本项目有少量的PC页面,直接写在了后端,如不配置,将无法访问。
可以看到,swagger的静态资源路径前缀是/META-INF/resources/,而本项目的静态资源路径是/static/,因此,需要额外配置。
springboot的核心理念是约定大于配置,在没有额外配置的情况下,其静态资源优先级如下:
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
/:当前项目的根路径
可以看到,swagger正是利用了这一点,将其静态资源放在了默认最高优先级目录下,无需额外配置可直接访问,但当项目中存在自定义的静态资源,且其路径不在此目录下时,是无法访问的。