本文的springboot版本为2.1.6.RELEASE
1.拦截器的作用
拦截器可以用于拦截一些非法请求。有时候后端在处理请求时,需要验证该请求是否合法。例如前端有一个请求可以获取到用户本人的信息,但未登录的用户是不能查看的,这时候可以通过拦截器来验证前端请求是否合法(通常合法的请求会在header中写入token令牌)。也可以通过拦截器设置哪些请求需要拦截验证,哪些请求无需验证。
拦截器的工作流程如下:
springboot拦截器的运行流程
在接受到前端请求时,首先会调用preHandle方法进行验证,若返回false,则直接结束流程,不对请求做任何处理。若返回true,则进入controller层处理请求。postHandle方法会在controller层请求处理完成后,视图渲染之前被调用,无返回值,afterCompletion方法会在整个请求处理完成之后被调用,通常用于资源清理工作,无返回值。
2.拦截器的实现
编写拦截器类需要实现HandlerInterceptor接口,并重写preHandle,postHandle以及afterComple方法。代码如下:
package com.bfgy.cds.common.config.Interceptor;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (handler instanceof HandlerMethod) {
//从request的header中获取token
String token = request.getHeader("token");
//验证token(这里只做了简单的验证,实际操作中可以通过Jwt来解析token)
if ("123".equals(token)) {
System.out.println("校验通过");
return true;
}
System.out.println("校验不通过");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
3.拦截器的配置
在实现完拦截器后,还需编写一个webMvcConfigurer来部署拦截器,需要实现webMvcConfigurer接口(在旧版本中是继承WebMvcConfigurer抽象类),注意在类上添加注解@Configuration。实现代码如下:
package com.bfgy.cds.common.config;
import com.bfgy.cds.common.config.Interceptor.AuthInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class MyWebAppConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册TestInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new AuthInterceptor());
registration.addPathPatterns("/**"); //所有路径都被拦截
registration.excludePathPatterns( //添加不拦截路径
"你的登陆路径", //登录
"/**/*.html", //html静态资源
"/**/*.js", //js静态资源
"/**/*.css", //css静态资源
"/**/*.woff",
"/**/*.ttf"
);
}
}
这样便完成了拦截器的编写与配置