过滤静态资源
springboot1.x和2.x拦截器中静态资源访问的区别
1.x的 resources/static 目录下的静态资源可以直接访问,当有配置自定义 HandlerInterceptor 拦截器时,请求静态资源路径不会被拦截 。
2.x的如果自定义 HandlerInterceptor 拦截器时访问静态资源就会被同步拦截,导致页面中访问这些静态资源出现 404。
解决方案
以下是 SpringBoot 2.x 以上的版本,1.x 的会自动处理。
第一种,不要过滤全部请求,也就是不要直接填写 /**
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/main","/admin/**");
}
不过,这种方式比较繁琐,整个网站有很多链接都需要手动一一拦截,好处就是静态资源不会被拦截,仅此而已。
第二种,将静态资源放在同一目录下,然后排除该目录;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/static/**","/webjars/**");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
这种方式,所有请求都会被拦截,除了排除过滤的链接之外。缺点,SpringBoot 对静态资源的默认配置也会被拦截。
webjars 是依赖方式的目录,所以这个可以一同排除。
后面的代码一定要添加,否则 SpringBoot 默认自动配置会对 static 目录进行处理。添加了后面的代码映射之后,就无需在配置文件中配置:spring.mvc.static-path-pattern
Q.E.D.