Springboot配置拦截器

126 阅读2分钟

2.拦截器HandlerInterceptor

image-20230426205722563.png 这里有三个方法

  • after是在接收请求之前进行拦截
  • post是 在数据处理中进行拦截
  • pre是在接受请求之后进行拦截
/**
 * 登录检查
 * 1、配置拦截器要拦截那些请求
 * 2. 把这些配置放在容器中
 * 3.
 */
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 执行目标方法之前
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        
    }
    /**
     * 执行目标方法之后
     */
    @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);
    }
}

  1. 把这些配置放在容器中
  2. 关于mvc的配置都是在WebMvcConfigurer中
/**
 * 1. 编写一个拦截器实现
 * 2.拦截器注册到容器中
 * 3.指定拦截规则注意拦截规则
 */
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LoginInterceptor())
                    //配置拦截那些路径 注意,配置拦截/**(拦截所有请求) 会导致静态资源也被拦截
                    .addPathPatterns("/**")
                    //不拦截那些路径
                .excludePathPatterns("");
    }
}

拦截器原理

  1. 根据当前请求,找到HandlerExecutionChain,以及可以处理请求的handler以及所有的拦截器

  2. 顺序执行所有拦截器的prehandler方法

     * 1.如过当前拦截器prehandler方法返回true,则执行下一个拦截器的prehandler方法
     * 2.如果当前拦截器返回为false,直接倒叙执行已经执行了的拦截器的afterCompletion
    
  3. 如果任何一个拦截器返回false直接跳出不执行目标方法

  4. 所有拦截器都返回true,执行目标方法

  5. 倒叙执行所有拦截器的posthandler方法

  6. 前面的步骤有任何异常都会直接出发afterCompletion

  7. 页面渲染完成之后,也会倒叙执行所有拦截器的afterCompletion