一、拦截器概述
拦截器是一种动态拦截方法调用的机制,类似于过滤器,它是由Spring框架提供的,用于动态拦截控制器(Controller)方法的执行。
他拦截请求之后,可以在制定方法的调用前后,执行拦截器里面的代码。
二、一个简单的拦截器
想要实现拦截器只需要以下三个步骤即可
1. 自定义拦截器,实现HandlerInterceptor
2. 实现接口中的拦截方法(preHandle-请求执行前、postHandler-请求执行后、aftercompletion-视图消染后)
3. 创建配置类,实现WebMvcconfigurer接口,重写addInterceptors方法
1. 自定义拦截器,重写三个方法(可以只重写需要的方法)
@Component
public class testInterceptor implements HandlerInterceptor {
@Override//请求执行前
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override//请求执行后
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override//视图消染后
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
2. 创建配置类
配置类的写法非常固定下面请看,首先要继承WebMvcConfigurer
然后是用addInterceptor注册拦截器
然后是用addPathPatterns添加需要拦截的路径
然后使用excludePathPatterns过滤掉不需要拦截的路径
order是在多个拦截器的情况下,配置先后顺序的
@Configuration
public class MvcConfig implements WebMvcConfigurer {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RefreshInterceptor(stringRedisTemplate)).addPathPatterns("/**").order(0);
registry.addInterceptor(new Logininterceptor())
.excludePathPatterns(
"/user/code", "/user/login", "/blog/hot",
"shop/**", "/shop-type/**",
"voucher/**"
).order(1);
}
3. 常见拦截路径配置