SpringBoot拦截器
拦截器的实现类
在编写一个拦截器的类的时候需要实现HandlerInterceptor接口
HandlerInterceptor接口方法如下:
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception;
void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception;
- preHandler:业务处理器处理请求之前被调用,对用户的request进行处理,若返回值为true,则继续调用后续的拦截器和目标方法;若返回值为false,则终止请求;这里可以加上登录校验,权限拦截等。
- postHandler:Controller执行后但未返回视图前调用该方法,这里可以对返回用户前的模型数据进行加工处理。
- afterCompletion:Controller执行后且返回视图后调用,可以得到Controller时的异常信息,这里可以记录操作日志,资源清理等。
实现注册拦截
这里我是重写的preHandler方法,用来登录拦截的。具体代码实现如下
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取request作用域中的token
String token = request.getHeader("token");
if (token == null) {
token = request.getParameter("token");
}
if (token != null) {
//解密token
Claims claims = JwtUtils.checkJWT(token);
if (claims != null) {
//获取解密后的信息
Integer userId = (Integer) claims.get("id");
String name = (String) claims.get("name");
request.setAttribute("user_id",userId);
request.setAttribute("name",name);
return true;
}
}
return false;
}
在这,返回的无非就是一个true或false,所以中间我写的是我的业务逻辑代码,也就是通过获取token来判断用户是否登录,若未登录,则返回false,终止该请求。
将拦截器加入到MVC中
在SpringBoot 2.0以上, WebMvcConfigurerAdapter已过时,但是WebMvcConfigurerAdapter实际上是WebMvcConfigurer接口的空实现类。故有两种方法可以实现:推荐使用:implements WebMvcConfigurer
方法有如下几种:
1. @EnableWebMvc + implements WebMvcConfigurer
在扩展类中重写父类的方法即可,这种方法会屏蔽springboot对SpringMVC的自动配置。
2. implements WebMvcConfigurer
在扩展类中重写父类的方法即可,这种方法会使用springboot对SpringMVC的自动配置。
3. extends WebMvcConfigurationSupport
在扩展类中重写父类的方法即可,这种方法会屏蔽springboot对SpringMVC的自动配置。
接下来就是需要将拦截器加入到MVC中,也就是配置刚刚创建的拦截器,我们创建一个类,加上@Configuration这个注解并且实现WebMvcConfigurer这个接口
然后重写addInterceptors这个方法把我们刚刚创建的拦截器配置好路径后添加到MVC中即可。
具体实现如下:
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器 并配置拦截路径
registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/user/api/v1/*/**");
//添加拦截器
WebMvcConfigurer.super.addInterceptors(registry);
}
}