原因:
springboot1.x和2.x拦截器中静态资源访问的区别
-
1.x的resources/static目录下的静态资源可以直接访问,当有配置自定义HandlerInterceptor拦截器时,请求静态资源路径不会被拦截 。
-
2.x的如果自定义HandlerInterceptor拦截器时访问静态资源就会被同步拦截,导致页面中访问这些静态资源出现404。
解决方法:
项目目录
自定义的登录拦截器
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter{
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
StringBuffer requestURL = request.getRequestURL();
System.out.println("-- "+requestURL.toString());
if(null == request.getSession().getAttribute("user")){
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
注册拦截器,指定拦截路径和排除的路径
@Configuration
public class WebConfigurer extends WebMvcConfigurationSupport{
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册登录拦截器
InterceptorRegistration loginRegistry = registry.addInterceptor(loginInterceptor);
//拦截路径
loginRegistry.addPathPatterns("/**");
//排序拦截路径
loginRegistry.excludePathPatterns("/login");
loginRegistry.excludePathPatterns("/getImageCode");
loginRegistry.excludePathPatterns("/check");
loginRegistry.excludePathPatterns("/static/**");
}
/*
*最重要的一步:在此处指明你在拦截器中排除拦截的静态资源路径指向的是classpath下static路径
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
补充
这段代码同时也指定了项目静态资源的访问路径,所以可以不用在application.properties中配置:spring.mvc.static-path-pattern=/static/**