详解SpringMVC的拦截器链实现及拦截器链配置

 更新时间:2022年08月30日 09:51:50   作者:mzz124  
拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器参数及拦截器链配置,感兴趣的可以尝试一下

1、拦截器链实现

只需定义多个拦截器的 bean,然后在拦截器的配置类中将其逐一添加即可

第一个拦截器的定义:

@Component
public class ProjectInterceptor1 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle111...");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle111...");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion111...");
    }
}

第二个拦截器的定义:

@Component
public class ProjectInterceptor2 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle222...");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle222...");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion222...");
    }
}

拦截器配置类:

@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
    @Autowired
    private ProjectInterceptor1 interceptor1;
    @Autowired
    private ProjectInterceptor2 interceptor2;
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(interceptor1).addPathPatterns("/books", "/books/*");
        registry.addInterceptor(interceptor2).addPathPatterns("/books", "/books/*");
    }
}

2、拦截器链的执行顺序

拦截器配置类中,首先被添加的拦截器在外层,之后添加的在内层,请求发出之后首先被外层的拦截器拦截,外层放行后进入内层,而离开拦截器时先离开内层的拦截器,再离开外层。

上例子中第一个拦截器在外层,第二个在内层,所以上例中拦截器的输出顺序为:

preHandle111...
preHandle222...
postHandle222...
postHandle111...
afterCompletion222...
afterCompletion111...

值得注意的是,afterCompletion 方法的一定会在 postHandle 之后执行,并且也是由内层向外层执行,所以 afterCompletion222 输出在 postHandle111 之后,而在 afterCompletion111 之前。换言之,即便有再多的拦截器,最先执行的 afterCompletion 也一定在最后执行的 postHandle 之后才执行

此外,当拦截器的 preHandle 方法返回 false 时,其内层的拦截器以及它自身 postHandle 和 afterCompletion 都不会再执行,而所有外层拦截器的 postHandle 不再执行,但 afterCompletion 照常执行

这是因为 postHandle 执行在原始 Controller 方法执行之后,必须所有拦截器都放行时,才会执行原始方法,也就才会执行 postHandle 方法

上例中第二个拦截器 preHandle 返回 false 时的输出顺序:

preHandle111...
preHandle222...
afterCompletion111...

到此这篇关于详解SpringMVC的拦截器链实现及拦截器链配置的文章就介绍到这了,更多相关SpringMVC拦截器链 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PowerJob的TransportServiceAware工作流程源码解读

    PowerJob的TransportServiceAware工作流程源码解读

    这篇文章主要介绍了PowerJob的TransportServiceAware工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 基于maven的ssm框架整合的示例代码

    基于maven的ssm框架整合的示例代码

    本篇文章主要介绍了基于maven的ssm框架整合的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 详解MyBatis XML配置解析

    详解MyBatis XML配置解析

    这篇文章主要介绍了详解MyBatis XML配置解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • MyBatis是如何实现日志模块的详解

    MyBatis是如何实现日志模块的详解

    这篇文章主要给大家介绍了关于MyBatis是如何实现日志模块的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用MyBatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • Java SpringBoot使用guava过滤器

    Java SpringBoot使用guava过滤器

    这篇文章主要介绍了Java SpringBoot使用guava过滤器,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • PowerJob的DispatchStrategy方法工作流程源码解读

    PowerJob的DispatchStrategy方法工作流程源码解读

    这篇文章主要为大家介绍了PowerJob的DispatchStrategy方法工作流程源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • SpringCloud 服务网关路由规则的坑及解决

    SpringCloud 服务网关路由规则的坑及解决

    这篇文章主要介绍了SpringCloud 服务网关路由规则的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java使用File类遍历目录及文件实例代码

    Java使用File类遍历目录及文件实例代码

    本篇文章主要介绍了Java使用File类遍历目录及文件实例代码,详细的介绍了File类的使用,有兴趣的可以了解一下。
    2017-04-04
  • java开发中基于JDBC连接数据库实例总结

    java开发中基于JDBC连接数据库实例总结

    这篇文章主要介绍了java开发中基于JDBC连接数据库的方法,以实例形式较为详细的总结分析了Java使用JDBC的具体步骤与注意事项,并附带了一个完整实例加以说明,需要的朋友可以参考下
    2015-11-11
  • 数据库阿里连接池 druid配置详解

    数据库阿里连接池 druid配置详解

    本篇文章主要介绍了数据库阿里连接池 druid配置详解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论