SpringMVC-12-放行静态资源访问
开发 SpringMVC 时,可能会遇到 html, css, js 等静态资源无法访问的情况
原因是 Servlet 配置中拦截处理了所有的路径,以至于静态资源的路径被当作 Controller 中的映射路径处理,却无法找到对应的 Controller 方法,下面有两种方法可以解决
方法1、缩小拦截的路径范围
刚才说原因是 Servlet 配置中拦截了静态资源的路径经常处理,只要缩小拦截的范围,只处理 Controller 中的路径就可以解决问题
对 Servlet 容器配置类中的 getServletMappings() 方法进行修改
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
// 其余重写的方法省略
@Override
protected String[] getServletMappings() {
return new String[]{"/books", "/users"}; // 原返回值只有 "/"
}
}
上面的样例只会拦截 /books 和 /users 为前缀的路径,不会再拦截其它的静态路径
方法2、注册静态资源处理
新增一个支持类继承自 WebMvcConfigurationSupport,重写其中的 addResourceHandlers() 方法,将静态资源的路径注册在其中,并且要使其能被 SpringMVC 的配置类扫描到
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 前为访问路径,后为资源的文件路径(末尾的 / 不能缺少),前后可以不一致
registry.addResourceHandler("/pages/**").addResourceLocations("/html/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
// 所有路径都按照静态资源处理(不常用)
// registry.addResourceHandler("/**").addResourceLocations("/");
}
}
设置 SpringMVC 配置类扫描范围
@Configuration
@ComponentScan({"com.mzz.controller", "com.mzz.config"}) // 刚才新增的类在 config 包下
@EnableWebMvc
public class SpringMvcConfig {
}
将所有路径都当作静态资源处理也是可以的,实测不会影响 Controller 中的路径,但有相同的路径时会出现冲突,比如 /books 和 /books.html 同时存在,前者可以正常访问,后者则会报错