Springboot 之 静态资源路径配置
Springboot 之 静态资源路径配置
-
静态资源路径是指系统可以直接访问的路径,且路径下的所有文件均可被用户通过浏览器直接读取。
-
在
Springboot
中默认的静态资源路径有: classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/ -
在
Springboot
中可以直接在配置文件中覆盖默认的静态资源路径的配置信息:
# 自定义的属性,指定了一个路径,注意要以/结尾web.upload-path=D:/temp/study13/
# 表示所有的访问都经过静态资源路径
spring.mvc.static-path-pattern=/**
# 覆盖默认配置,所以需要将默认的也加上否则static、public等这些路径将不能被当作静态资源路径
# 在最末尾的file:${web.upload-path}中的file:表示是一个具体的硬盘路径,其他的使用classpath指的是系统环境变量
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
- 在
SpringBoot
开发中,可以在Java
代码中覆盖默认静态资源配置
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
// public class WebMvcConfig implements WebMvcConfigurer {
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
if(!registry.hasMappingForPattern("/static/**")){
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
super.addResourceHandlers(registry);
}
}
- 由于
Spring Boot
默认资源路径配置的问题,使用IDEA
开发Spring Boot
应用时,会导致一个问题————浏览器、编辑器 不能同时访问JS
等资源的问题。这时往往通过配置 4 中的代码,来实现同时访问资源文件的效果
附:
package com.wzhz.common.core.config;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author wzhz
* @date 2020年3月24日
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Value("${spring.resource.static-locations}")
private String staticLocations;
/**
* 全局跨域支持,过滤器方式
*
* @return
*/
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
final CorsConfiguration corsConfiguration = new CorsConfiguration();
/* 是否允许请求带有验证信息 */
corsConfiguration.setAllowCredentials(true);
/* 允许访问的客户端域名 */
corsConfiguration.addAllowedOrigin("*");
/* 允许服务端访问的客户端请求头 */
corsConfiguration.addAllowedHeader("*");
/* 允许访问的方法名,GET POST等 */
corsConfiguration.addAllowedMethod("*");
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
/**
* 静态资源的配置 - 使得可以从磁盘中读取 Html、图片、视频、音频等
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(staticLocations.split(","));
}
@Override
public void addViewControllers(ViewControllerRegistry viewControllerRegistry) {
// 首页跳转页面
viewControllerRegistry.addViewController("/").setViewName("/index.html");
}
@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}
/**
* 解决ie responsebody返回json的时候提示下载问题
*
* @return
*/
@Bean
public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
List<MediaType> supportedMediaTypes = Lists.newArrayList();
supportedMediaTypes.add(new MediaType(MediaType.TEXT_HTML, Charset.forName("UTF-8")));
supportedMediaTypes.add(new MediaType(MediaType.APPLICATION_JSON_UTF8, Charset.forName("UTF-8")));
jsonConverter.setSupportedMediaTypes(supportedMediaTypes);
return jsonConverter;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(stringHttpMessageConverter());
converters.add(customJackson2HttpMessageConverter());
}
}
spring:
profiles:
active: dev #环境 dev|test|prod
mvc:
static-path-pattern: /**
resource:
#自定义静态资源路径,处理方式见WebMvcConfig.java
static-locations: classpath:/static/,classpath:/public/
No Comments