SpringMVC拦截器

一、SpringMVC拦截器的原理

preHandle 在业务处理器处理请求之前被调用:

  1. 如果返回 false,从当前的拦截器往回执行所有拦截器的 afterCompletion(),再退出拦截器链。
  2. 如果返回 true,执行下一个拦截器,直到所有的拦截器都执行完毕;再执行被拦截的 Controller;然后进入拦截器链,从最后一个拦截器往回执行所有的 postHandle(),接着再从最后一个拦截器往回执行所有的 afterCompletion()。

二、SpringMVC拦截器的两种实现方式

  1. 定义实现了 Spring 的 HandlerInterceptor 接口的 Interceptor 类。
  2. 是继承实现了 HandlerInterceptor 接口的类,比如 Spring 已经提供的实现了 HandlerInterceptor 接口的抽象类 HandlerInterceptorAdapter。

HandlerInterceptor 接口中定义了三个方法 preHandle、postHandle和afterCompletion。

  • preHandle 在业务处理器处理请求之前被调用。
  • postHandle 在业务处理器处理请求执行完成后,生成视图之前执行。
  • afterCompletion 在 DispatcherServlet 完全处理完请求后被调用,可用于清理资源等 。对用户的请求进行拦截处理,就是通过这三个方法。
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, 
                            Exception arg3) throws Exception {}

@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, 
                        ModelAndView arg3) throws Exception {}

@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) 
throws Exception {
    return false;
}

三、说明

1️⃣【preHandle()】这个方法在业务处理器处理请求之前被调用,SpringMVC 中的 Interceptor 是链式调用的,在一个应用或是一个请求中可以同时存在多个 Interceptor 。每个 Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是 Interceptor 中的 preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者对当前请求做预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是 Boolean 的,当它返回值为 false 时表示请求结束,后续的 Interceptor 和 Controller 都不再执行;当返回值为 true 时就会继续调用下一个 Interceptor 的 preHandle 方法,如果已经是最后一个 Interceptor 的时候就会调用当前请求的 Controller 方法。

2️⃣【postHandle()】这个方法在当前请求进行处理之后,也就是 Controller 方法调用之后执行。但是它会在 DispatcherServlet 进行视图返回渲染之前被调用,所以可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作。postHandle 方法被调用的方向跟 preHandle 是相反的,也就是说先声明的 Interceptor 的 postHandle 方法反而会后执行。

3️⃣【afterCompletion()】该方法也是需要当前对应的 Interceptor 的 preHandle 方法的返回值为 true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、定义Interceptor实现类 SpringMVC 中的Interceptor 拦截请求是通过Handler...
    bboymonk阅读 386评论 0 0
  • 本文作者:钟昕灵,叩丁狼高级讲师。原创文章,转载请注明出处。 前言 Spring MVC属于SpringFrame...
    叩丁狼教育阅读 3,339评论 1 4
  • Interceptor拦截器是Spring MVC中重要的功能,它的主要作用是拦截用户的请求 并进行相应的处理。比...
    养码哥阅读 539评论 0 1
  • SpringMVC拦截器 什么是拦截器? 拦截器是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强。通常用来...
    sunhaiyu阅读 404评论 0 0
  • 姓名: 李小娜 [嵌牛导读]: SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,...
    n184阅读 3,212评论 0 4