Appearance
SpringMVC教程 - 14 拦截器
14.1 拦截器简介
在项目中,我们肯定会有这样的需求:
- 有些接口或页面只有登录才能访问,没有登录则跳转到登录,或返回没有登录的错误码;
- 需要打印每个接口的请求地址、请求参数、请求时间等信息,用于排查问题或性能优化;
- 修改请求或响应的内容,例如添加头信息,或修改响应数据;
- ...等等
怎么实现?你可以在每个接口中去实现,那显然是令人发指的操作,如果要修改,那不是要死人。
所以就需要一个可以统一来处理的地方,在请求真正进入 Controller 之前进行统一处理,我们可以使用 Spring MVC 拦截器(Interceptor)。
其实拦截器不只是能在 Controller 方法调用之前进行处理,还可以在 Controller 方法调用之后、请求完成之后执行一些操作, SpringMVC拦截器有以下三个方法,我们可以按需进行重写,实现自己想要的操作:
| 方法 | 作用时间 | 功能举例 |
|---|---|---|
preHandle() | Controller 方法执行前,如果返回true,则继续执行后续的拦截器和控制器方法;如果返回false,则中断执行流程; | 登录校验、参数检查 |
postHandle() | Controller 方法执行后、视图渲染前 | 修改 Model 数据 |
afterCompletion() | 整个请求结束后 | 日志记录、资源清理 |
拦截器可以有多个,可以依次执行,各个拦截器方法执行的前后顺序如下:

preHandle() 方法默认返回 true,也就是不拦截。当重写 preHandle() 方法,在方法中触发返回 false 后,整个请求会被拦截,不再向后传播。后续其他拦截器的 preHandle()、postHandle()、 afterCompletion() 都不会执行;当前拦截器的 postHandle() 和 afterCompletion() 也不会执行;但之前已经执行过 preHandle() 的拦截器,它们的 afterCompletion() 会执行。
14.2 拦截器的基础使用
说了那么多,现在开始创建并使用拦截器。
下面创建一个拦截器,用来打印每个请求的执行时长。
内容未完......