
Spring MVC
的处理器拦截器,类似于 Servlet
开发中的过滤器 Filter
,用于对处理器进行预处理和后处理。
应用场景
- 日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV 等。
- 权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面。
- 性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。
- 通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用。
这里我们简单实现登录拦截功能。
Spring MVC 拦截器
Spring MVC
拦截器需要实现 HandlerInterceptor
接口,该接口定义了 3 个方法,分别为 preHandle()
、postHandle()
和 afterCompletion()
,需要通过重写这 3 个方法来对用户的请求进行拦截处理的。
preHandle()
:该方法在请求处理之前进行调用。该方法的返回值是布尔值Boolean
类型的,当它返回为false
时,表示请求结束,后续的Interceptor
和Controller
都不会再执行;当返回值为true
时,就会继续调用下一个拦截器的preHandle
方法,如果已经是最后一个拦截器的时候,就会是调用当前请求的Controller
中的方法。postHandle()
:只能在当前所属拦截器的preHandle()
的返回值为true
的时候,才能被调用。postHandle()
在当前请求进行处理之后,也就是在Controller
中的方法调用之后执行,但是它会在DispatcherServlet
进行视图返回渲染之前被调用,所以在这个方法中对Controller
处理之后的ModelAndView
对象进行操作。afterCompletion()
:也是需要当前对应的当前的preHandle()
的返回值为true
时才会执行。因此,该方法将在整个请求结束之后,也就是在DispatcherServlet
渲染了对应的视图之后执行,这个方法的主要作用是用于进行资源清理的工作。
创建拦截器
这里以登录拦截器作为演示示例。当未登录时是无法直接访问需要登录权限的操作的,为了做到这个效果,我们使用登录拦截器来判断用户是否登录,如果用户已登录则放行让用户继续操作,否则就将其跳转到登录页。
创建 LoginInterceptor
拦截器类
1 | public class LoginInterceptor implements HandlerInterceptor { |
配置拦截器
拦截器定义后还需要在 spring-mvc.xml
文件中配置拦截器,代码如下:
1 | <!-- 拦截器配置,拦截顺序:先执行后定义的,排在第一位的最后执行。--> |
相关配置说明:
mvc:interceptor
:定义一个拦截器mvc:mapping
:映射路径,需要拦截的请求路径mvc:exclude-mapping
:需要排除的请求路径,比如登录页本身是不需要拦截的,这里还包括了静态资源路径也是不需要拦截的bean
:配置指定的拦截器对象
更多干货请移步:https://antoniopeng.com
If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !