拦截器简介
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>
拦截器链与执行顺序
如果一个URL能够被多个拦截器所拦截,全局拦截器最先执行,其它拦截器根据配置文件中配置从上到下执行。
结论:
- preHandle()顺序执行,postHandle()、afterComletion()逆序执行。
- 只要有一个preHandle()拦截,后面的preHandle(),postHandle()都不会执行。
- 只要相应的preHandle()放行,afterComletion()就会执行。