拦截器
- 拦截器(Interceptor)是一种动态的拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
- 作用:
    - 在指定方法调用前后执行预先设定的代码
- 阻止原始方法的执行
 
就好像电影院里检票发3D眼镜的大叔大妈一样。
拦截器与过滤器的区别
- 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
- 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强
拦截器的设置
- 制作拦截器功能类
- 配置拦截器的执行位置
功能类需要继承HandlerInterceptor接口并实现三个方法如下:
@Component
public class ProjectInterceptor implements HandlerInterceptor {
    /**
     * 处理器执行之前调用
     * @param request  HttpServletRequest对象,可以获取请求参数等等
     * @param response HttpServletResponse对象
     * @param handler  拦截器的Controller对象
     * @return 如果返回false,就会中断处理流程,不会处理后续的拦截器和Controller。如果返回true,则会执行后续的拦截器和处理器
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
    /**
     * 处理器执行之后调用,跳转到指定视图之前调用
     * @param request  HttpServletRequest对象
     * @param response HttpServletResponse对象
     * @param handler  拦截器的Controller对象
     * @param modelAndView  ModelAndView对象,其中存放的是处理结果和视图的信息
     */
    @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);
    }
}
- 配置拦截器拦截路径的方法为:
    - 使SpringMVC配置类继承WebMvcConfigurer接口,并实现其中的addInterceptors()方法
- 在addInterceptors()方法中添加需要拦截的路径即可
 
- 使SpringMVC配置类继承
@Configuration
@EnableWebMvc
@ComponentScan("org.YD.controller")
public class SpringMvcConfig implements WebMvcConfigurer {
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(projectInterceptor).addPathPatterns("/users","/users/*");
    }
}
拦截器功能类中的参数
- request  HttpServletRequest对象
    - 可以获取请求参数等等
 
- response HttpServletResponse对象
    - 可以在响应中添加数据
 
- handler  拦截器的Controller对象
    - 可以获取请求目标的信息
 
- modelAndView  ModelAndView对象
    - 其中存放的是处理结果和视图的信息
- 通常用来完成资源重定向
 
拦截器链的配置
- 可以在一个项目中配置多个拦截器,他们之间的关系类似于嵌套,我们称之为拦截器链
- 拦截器链的执行顺序与配置拦截路径时的顺序相同
如下代码就代表projectInterceptor嵌套projectInterceptor2。
    @Autowired
    private ProjectInterceptor projectInterceptor;
    @Autowired
    private ProjectInterceptor2 projectInterceptor2;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(projectInterceptor).addPathPatterns("/users","/users/*");
        registry.addInterceptor(projectInterceptor2).addPathPatterns("/users","/users/*");
    }
