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
如果你喜欢这个博客或发现它对你有用,欢迎你点击右下角 “OPEN CHAT” 进行评论。也欢迎你分享这个博客,让更多的人参与进来。如果在博客中的内容侵犯了您的版权,请联系博主删除它们。谢谢你!