springMVC拦截器

102 阅读1分钟

拦截器简介

image.png springMVC拦截器也是AOP思想的一种实现方式,它与Servlet的过滤器功能类似,主要用于拦截用户的请求并作相应的处理,通常应用在权限验证,记录请求信息的日志,判断用户是否登录等功能上。

拦截器和过滤器的区别 (面试常考)
  • 拦截器是springMVC的组件,而过滤器是Servlet的组件
  • 拦截器不依赖Web容器,过滤器依赖Web容器
  • 拦截器只能对控制器请求起作用,而过滤器则可以对所有请求起作用
  • 拦截器可以自己直接获取IOC容器中的对象,而过滤器就不太方便获取

拦截器的使用

创建拦截器类,需要实现HanderlerInterceptor接口,需要重写三个方法:

  • preHander:请求到达Controller前执行的方法,返回值为true通过拦截器,返回值为false被拦截器拦截。
  • postHandle:跳转到JSP前执行的方法
  • afterCompletion:挑战到JSP后执行的方法 还需要在springMVC核心配置文件中配置拦截器
<mvc:interceptors>
    <mvc:interceptor>
        <!--配置拦截器的作用路径-->
        <mvc:mapping path="路径">
         <!--拦截器对象-->
         <bean class="类路径">
    </mvc:interceptor>
</mvc:interceptors>

全局拦截器

全局拦截器可以拦截所有控制器的处理的URL,作用等于/* *,配置方法如下

<!-- 配置拦截器 -->
<mvc:interceptors>  
   <!-- 全局拦截器 -->    
   <beanclass="拦截器对象路径"></bean>
</mvc:interceptors>

拦截器链与执行顺序

image.png 如果一个URL能够被多个拦截器所拦截,全局拦截器最先执行,其它拦截器根据配置文件中配置从上到下执行。 结论:

  • preHandle()顺序执行,postHandle()、afterComletion()逆序执行。
  • 只要有一个preHandle()拦截,后面的preHandle(),postHandle()都不会执行。
  • 只要相应的preHandle()放行,afterComletion()就会执行。