@TOC
原文链接:放行静态资源
问题描述
- 在开发项目时,不免会用到一些如 CSS、HTML、JS 等静态资源,但是我们在配置 SpringMVC 的拦截路径时,设定的拦截路径为 “/” ,这也就意味着,我们输入地址访问静态资源时也会误认为在 Controller 层定义了相应的映射方法,但实际上我们并没有定义,只是在访问静态路径而已。
- 当访问静态资源时,报 404 错误,这是因为将 "/pages/books.html" 当作了映射路径,想从 Controller 包中找到匹配的映射方法。
解决方案
- 新建 SpringMvcSupport 类
@Configuration public class SpringMvcSupport extends WebMvcConfigurationSupport { @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/pages/**").addResourceLocations("/pages/"); registry.addResourceHandler("/css/**").addResourceLocations("/css/"); registry.addResourceHandler("/js/**").addResourceLocations("/js/"); registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/"); } }
- 该类继承 WebMvcConfigurationSupport 类,并重写 addResourceHandlers 方法,在方法体中编写放行静态资源的代码。
- 当请求路径中遇到如 “/pages/**” 时,不会去 Controller 层寻找映射方法,而是映射到 “/pages/” 静态文件下寻找资源。
- 因为是和表现层相关的配置类,所以需要在 SpringMvcConfig 配置类中加载该配置类,使其生效。
@Configuration @ComponentScan({"qdxorigin.controller","qdxorigin.config"}) @EnableWebMvc public class SpringMvcConfig { }
- 我使用的是扫描包的方式,只要能让配置类生效,大家也可以选择其他方式。
- 此时,我们重启 tomcat 后,再次访问静态资源就可以成功访问了。