当我们日常生产中,访问静态资源一般需要设置静态资源访问前缀,目的是静态资源不会被普通的拦截器拦截等.......
但是当我们访问欢迎页时,如果我们之前设置过静态资源访问前缀,结果就会为404找不到资源,这个原因我们可以从springboot源码来探究
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
return welcomePageHandlerMapping;
}
WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,
ApplicationContext applicationContext, Optional<Resource> welcomePage, String staticPathPattern) {
//注意这个地方1
if (welcomePage.isPresent() && "/**".equals(staticPathPattern)) {
logger.info("Adding welcome page: " + welcomePage.get());
setRootViewName("forward:index.html");
}
//注意这个地方2
else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {
// 调用Controller /index
logger.info("Adding welcome page template: index");
setRootViewName("index");
}
}
从源码得知,当我们的欢迎页存在且我们spring.mvc.staticPathPattern为"/**"时,服务器会自动转发到index.html中
那么当我们在yaml配置文件中设置了static-path-patter时,第一个if语句就不会进入,会进入第二个if语句,即服务器会寻找/index请求。
问题到这里就很明朗了,我们设置了静态资源访问前缀后,我们只需要添加一个"/index"请求,这个请求返回index.html即可。这样当我们服务器在寻找欢迎页时,此时我们服务器会自动寻找"/index"请求,进而返回我们返回的index.html页面。
所以我们这个请求是同步的,不能添加@ResponseBody,但是我们通常在控制器层就设置了@RestController(等于@Controller+@ResponseBody),这时我们也不需要将@RestController改为@Controller,而是直接将我们的"/index"请求返回ModelAndView试图页面,ModelAndView对象调用setViewName方法来设置我们的返回页面,之后thymeleaf会自动解析我们templates文件夹中的index.html页面,至此,问题解决。