1. 此坑的背景
说到这个坑,来得挺机缘巧合的。当时老师带着我们做springboot项目时,因为涉及到了登录权限的问题,所以,就带着我们写了个登录拦截器。这一写,导致我整个springboot项目中的静态资源全都无法访问。当时,看着老师的项目是能够正常访问的,所以,当我出现这个问题时,我并没有考虑到是拦截器的原因。趁此机会,我就适当地去了解下SpringBoot对静态资源的处理。说实话,这个问题折腾了我一个下午,这确实令人有点抓狂,好在这个问题最终被解决了。在此,记录一下。
2. SpringBoot1.5.x
SpringBoot2.0+与SpringBoot1.5.x之间还是存在许多差别的。可以看看这篇博文------Spring Boot1.5X升级到2.0指南,说不定对你有帮助。
在SpringBoot1.5.x中,放在resources/static目录下的静态资源可以被直接访问的,并且访问路径不需要带上“static”。如果,你还不太清楚springboot对静态资源的处理,可以查看这篇博文 SpringBoot对静态资源映射的处理
即使给此版本的springboot项目添加拦截器,请求静态资源时,也不会被拦截。因为我比较懒,在此处就不给出相应的例子了。(下面有)
3. SpringBoot2.0+
添加拦截器:
要想实现登录拦截,可以使用SpringMVC中的拦截器。类似于Servlet中的过滤器
@Component
public class UserLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user = (User)request.getSession().getAttribute("user");
if (StringUtils.isEmpty(user)) {
response.sendRedirect("/login.html");
return false;
}
return true;
}
}
新建一个类UserLoginInterceptor并实现了HandlerInterceptor接口(里面的三个方法均为jdk8中的新特性----默认方法),重写了preHandle()方法。如果用户已登录,则放行;否则,重定向到登录页面login.html
preHandle(): 在请求时,进入到Controller中的方法之前进行调用preHandle()方法。如果返回true,继续访问Controller中的方法;否则,终止请求。
具体的内容可以查看: 处理器拦截器(HandlerInterceptor)详解
注册拦截器:
仅仅写了个登录拦截器并通过IOC注入到Spring容器中还不行,必须通过一个配置类进行配置此拦截器,才能生效。此配置类需要实现一些规范接口。它可以实现WebMvcConfigurer接口,或者继承WebMvcConfigurationSupport类。WebMvcConfigurerAdapter类已经被废弃了
配置类:
@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {
@Autowired
private UserLoginInterceptor userLoginInterceptor;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// 1.注册拦截器
InterceptorRegistration interceptor = registry.addInterceptor(userLoginInterceptor);
// 2. 配置拦截规则
interceptor
.a