撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>>

  • Spring拦截器
  • HandlerInterceptorAdapter需要继承,HandlerInterceptor需要实现
  • 可以作为日志记录和登录校验来使用
  • 建议使用HandlerInterceptorAdapter,因为可以按需进行方法的覆盖。

主要为3种方法:

  • preHandle:拦截于请求刚进入时,进行判断,需要boolean返回值,如果返回true将继续执行,如果返回false,将不进行执行。一般用于登录校验。
  • postHandle:拦截于方法成功返回后,视图渲染前,可以对modelAndView进行操作。
  • afterCompletion:拦截于方法成功返回后,视图渲染前,可以进行成功返回的日志记录。

简介
SpringWebMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于处理器进行预处理和后处理。

应用场景
1、日志记录,可以记录请求信息的日志,以便进行信息监控、信息统计等。
2、权限检查:如登陆检测,进入处理器检测是否登陆,如果没有直接返回到登陆页面。
3、性能监控:典型的是慢日志

public interface HandlerInterceptor {/*** 预处理回调方法,实现处理器的预处理(如检查登陆),第三个参数为响应的处理器,自定义Controller* 返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;*/boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception;/*** 后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。*/void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception;/*** 整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中*/void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception;}

拦截器适配器HandlerInterceptorAdapter
有时候我们可能只需要实现三个回调方法中的某一个,如果实现HandlerInterceptor接口的话,三个方法必须实现,不管你需不需要,此时spring提供了一个HandlerInterceptorAdapter适配器(种适配器设计模式的实现),允许我们只实现需要的回调方法。

public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {/*** 默认是true*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {return true;}/*** This implementation is empty.*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception {}/*** This implementation is empty.*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {}/*** 不是HandlerInterceptor的接口实现,是AsyncHandlerInterceptor的,AsyncHandlerInterceptor实现了HandlerInterceptor*/@Overridepublic void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {}}

这样在我们业务中比如要记录系统日志,日志肯定是在afterCompletion之后记录的,否则中途失败了,也记录了,那就扯淡了。一定是程序正常跑完后,我们记录下那些对数据库做个增删改的操作日志进数据库。所以我们只需要继承HandlerInterceptorAdapter,并重写afterCompletion一个方法即可,因为preHandle默认是true。

运行流程总结如下:

1、拦截器执行顺序是按照Spring配置文件中定义的顺序而定的。

2、会先按照顺序执行所有拦截器的preHandle方法,一直遇到return false为止,比如第二个preHandle方法是return false,则第三个以及以后所有拦截器都不会执行。若都是return true,则按顺序加载完preHandle方法。

3、然后执行主方法(自己的controller接口),若中间抛出异常,则跟return false效果一致,不会继续执行postHandle,只会倒序执行afterCompletion方法。

4、在主方法执行完业务逻辑(页面还未渲染数据)时,按倒序执行postHandle方法。若第三个拦截器的preHandle方法return false,则会执行第二个和第一个的postHandle方法和afterCompletion(postHandle都执行完才会执行这个,也就是页面渲染完数据后,执行after进行清理工作)方法。(postHandle和afterCompletion都是倒序执行)

HandlerInterceptorAdapter或HandlerInterceptor的使用相关推荐

  1. Spring拦截器HandlerInterceptor和HandlerInterceptorAdapter

    参考 https://blog.csdn.net/zhibo_lv/article/details/81699360 https://www.cnblogs.com/jing99/p/11147152 ...

  2. (转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)

    1.  过滤器跟拦截器的区别 在说拦截器之前,不得不说一下过滤器,有时候往往被这两个词搞的头大. 其实我们最先接触的就是过滤器,还记得web.xml中配置的<filter>吗~ 你应该知道 ...

  3. Spring MVC Interceptor Handler InterceptorAdapter HandlerInterceptor示例

    Spring MVC Interceptor HandlerInterceptorAdapter,HandlerInterceptor示例 Spring Interceptor用于拦截客户端请求并处理 ...

  4. HandlerInterceptor 处理器拦截器的用法

    SpringMVC 中的HandlerInterceptor 拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. (如无特殊说明,下文所说的拦截器即处理器拦截器) ...

  5. HandlerInterceptor与MethodInterceptor

    HandlerInterceptor是springMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行.实现一个HandlerInterceptor拦截器可以直接 ...

  6. 第五章 处理器拦截器详解——跟着开涛学SpringMVC

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.   ...

  7. SpringMVC的文件上传和拦截器

    目录 一.文件上传 1.概述 2.案例1 3.案例2 二.拦截器 1.HandlerInterceptor接口 2.案例:拦截器实现用户权限验证 一.文件上传 1.概述 SpringMVC会将上传文件 ...

  8. 在拦截器里放入参数 controller_干货|SpringMVC拦截器的使用详解

    一.拦截器简介 Spring MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信 ...

  9. 第五章 处理器拦截器详解

    5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...

最新文章

  1. 有几个人会用计算机,怎么知道我家的wifi有几个人在使用
  2. python elasticsearch update_使用python的elasticsearch部分更新
  3. 1006. Sign In and Sign Out (25)-PAT甲级真题
  4. 别人的1024程序员节VS你的1024程序员节
  5. postgresql 参数替换 游标_解决postgresql和oracle如何把游标cursor数据存到数组array
  6. mysql配置优化ya_mysql性能调优工具之mytop
  7. PyCharm中文指南2.0
  8. c语言标准库函数大全用法,C 标准库函数
  9. 手机上微信总是说无法连接服务器错误代码,微信登录失败怎么办|微信登录失败常见提示及处理方法...
  10. python工具包--Pandas
  11. office2013多次输入激活码的问题
  12. 树莓派中的 IM 私有云支持多少并发?
  13. 如何为公司创造价值?
  14. html+元素+屏幕固定,jquery.pinBox-可将任何元素固定在容器中的jQuery插件
  15. LaTeX公式-Katex解析
  16. 程序员必备的 11 大Intellij插件
  17. 关于html5外文翻译三千字,论文外文文献翻译3000字左右.pdf
  18. Mac版本EndNote基本用法
  19. Java+Swing+mysql5实现超市商品管理系统
  20. log4j日志文件乱码问题的解决方法

热门文章

  1. 35岁以上的程序员们,后来都干什么去了?
  2. Django中一个项目使用多个数据库(原生sql 的使用,亲测)
  3. ElasticSearch面试 - es 在数据量很大的情况下如何提高查询效率啊?
  4. 好的MongoDB中文文档
  5. SSH Secure Shell Client用public key认证登录
  6. sublime text实现函数跳转(window环境)
  7. Go使用go-clickhouse库
  8. mysql职业要求_为什么面试的每一家都要求掌握MySQL?
  9. MySQL Server has gone away报错原因汇总
  10. html点击圆点箭头分页,css实现小箭头的实现方式