问题
今天做springboot项目中的拦截器的demo时发现静态资源被拦截,出现302错误。
302 redirect: 302 代表暂时性转移(Temporarily Moved )。
意思就是你访问网址A,但是网址A因为服务器端的拦截器或者其他后端代码处理的原因,会被重定向到网址B。
静态资源被HandlerInterceptor拦截了!
原因
在网上找了半天发现是springboot2.0才会出现的问题。
因为spring boot 2.x依赖的spring 5.x版本,相对于spring boot 1.5.x依赖的spring 4.3.x版本而言,针对资源的拦截器初始化时有区别,有兴趣请查看源码。
解决办法:
1.我们在拦截器的配置文件里添加静态资源路径以及设置不拦截的静态资源
@Configuration
public class SessionConfiguration implements WebMvcConfigurer {
/**
* 注册添加静态资源
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
/**
* 注册添加拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration addInterceptor = registry.addInterceptor(getSecurityInterceptor());
addInterceptor.excludePathPatterns("/static/**");//不拦截静态资源
addInterceptor.excludePathPatterns("/login");
addInterceptor.excludePathPatterns("/loginCheck");
addInterceptor.addPathPatterns("/**");
}
@Bean
public SessionInterceptor getSecurityInterceptor() {
return new SessionInterceptor();
}
/**
* 添加默认主页,访问域名或者端口跳转
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:login.html");
}
}
2.注意前端页面引用静态资源路径,不然出现404(本例前端模板是thymeleaf)
<link rel="stylesheet" type="text/css" th:href="@{/static/css/heart.css}"/>
<script type="text/javascript" th:src="@{/static/js/jquery-1.8.3.js}"></script>
<script type="text/javascript" th:src="@{/static/js/index.js}"></script>
这样就解决了静态资源被拦截的问题。