拦截器

Web相关

Posted by YD Blog on November 8, 2022

拦截器

  • 拦截器(Interceptor)是一种动态的拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行
  • 作用:
    • 在指定方法调用前后执行预先设定的代码
    • 阻止原始方法的执行

就好像电影院里检票发3D眼镜的大叔大妈一样。

拦截器与过滤器的区别

  • 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
  • 拦截内容不同:Filter对所有访问进行增强,Interceptor仅针对SpringMVC的访问进行增强

拦截器的设置

  1. 制作拦截器功能类
  2. 配置拦截器的执行位置

功能类需要继承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()方法中添加需要拦截的路径即可
@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/*");
    }