1. 简介
什么是拦截器?
-
SpringMVC中的拦截器,相当于web开发中的过滤器Filter,用于对Controller进行预处理和后处理
-
多个拦截器形成的一条链,称为拦截器链(Interceptor chain)
-
当访问被拦截的方法或字段时,拦截器链中的拦截器就会按照之前定义的顺序被调用
-
-
拦截器也是AOP思想的具体实现
2.拦截器使用步骤
2.1创建一个Java类,实现HandlerInterceptor
接口
重写接口的方法,共三个方 法:preHandle, postHandle, afterCompletion
public class MyInterceptor1 implements HandlerInterceptor {
/**
* 在请求调用到Controller方法之前,先执行的拦截方法
* 如果返回true:表示放行
* 如果返回false:表示不放行
*
* 使用场景: 可以进行权限判断
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("===MyInterceptor1.preHandler===");
return true;
}
/**
* 在Controller方法执行之后、渲染视图之前,再执行的方法
* @param modelAndView 目标方法执行完成返回的结果。
* 使用场景:可以在这里对目标方法返回的 视图路径、数据做修改处理(通常不需要)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("===MyInterceptor1.postHandle===");
}
/**
* 在服务端一切处理完成之后,给客户端返回HTTP响应之前执行的
* 使用场景:可以处理异常、释放某些资源等等最终处理的操作(通常不需要)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("===MyInterceptor1.afterCompletion===");
}
2.2在springmvc.xml中配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<mvc:exclude-mapping path="/user/login"/>
<bean class=配置器全限定类名"/>
</mvc:interceptor>
</mvc:interceptors>
3.拦截器详解
3.1API详解:
preHandle()
-
在控制器方法被调用之前先执行
-
如果方法返回true,表示放行;如果方法返回false,表示不放行
postHandle()
-
在控制器方法执行后、渲染视图之前执行
-
无返回值
afterCompletion()
-
在Controller完全执行完毕之后(渲染视图之后),返回响应前执行
3.2配置详解
-
<mvc:interceptor>
一个拦截器的配置 -
<mvc:mapping path=""/>
配置拦截器的拦截范围 -
<mvc:exclude-mapping path=""/>
排除不拦截的范围 -
<bean/>
配置拦截器类
3.3多个拦截器执行顺序
执行顺序:
-
由配置的顺序决定,谁在前谁就先拦截。
-
谁的预处理先执行,那么它的后处理就要后执行