springboot 拦截器 及 可能失效原因

  拦截器handleInterceptor是一个类似于filter的东西,不过他的拦截比filter更加精准,可以到达方法级别,拦截器的执行时间是filter之后,可以和filter同时使用,但是handleInterceptor是springMVC的内容,离开了springMVC就不好用了,建议使用filter,更具通用性。
  filter在doFilter里,可以在chain.doFliter前后做一下操作 ,chain.doFilter的最里层执行的是controll而,而在这个拦截器就是在controller前后执行,所以拦截器的执行是在filter和controller之间。
  filter在controller前后执行一些操作,拦截器相比较而言多了一个操作,拦截器有三个操作:

代码地址:https://github.com/wkcaeser/springboot-studydemo

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Interceptor1 start work");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor1 before return view");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Interceptor1 finish work");
    }

preHandle是在进入controller之前执行,postHandle是在返回model渲染视图之前执行,afterCompletion是在request执行完成后执行的。
拦截器和filter一样,有一条执行链,内部其实是个数组,现在定义的先执行。
下面再定义一个interceptor,然后注册:

public class Interceptor2 implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Interceptor2 start work");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor2 before return view");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Interceptor2 finish work");
    }
}

springboot2.0以后WebMvcConfigurerAdapter类被废弃了,改用WebMvcConfigurationSupport

@Configuration
public class WebAppConfigurer extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Interceptor2()).addPathPatterns("/");
        registry.addInterceptor(new Interceptor1()).addPathPatterns("/");
        super.addInterceptors(registry);
    }
}

通过改变注册的顺序可以看到拦截器执行顺序发生了改变。
拦截器拦截的请求路径要注意,很容易进坑,/* 拦截一级路径, /**拦截多级路径,不注意很容易出现拦截器失效的情况。
拦截器相当与包围着controller执行,所以拦截器做权限过滤、日志统计等工作是相当方便。

你可能感兴趣的:(spring-boot)