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 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JFS_Study

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值