拦截器HandlerInterceptor接口,定义一个类实现该接口,重写接口的三个方法preHandle()前置拦截,postHandle()后置拦截,afterCompletion()最终拦截
三个方法的执行顺序为:
- preHandle()前置拦截,方法执行在Controller之前,返回值为布尔类型,true代表不拦截,false代表拦截,其中Object参数代表访问此Controller的类
- 执行Controller
- postHandle()后置拦截,执行完Controller之后,且视图解析器没有把视图解析成页面执行此方法,此方法多一个参数ModelAndView,可对视图做统一修改
- afterCompletion()最终拦截,视图解析器执行完Controller之后执行此方法,比前置拦截多个Exception参数,所有的错误会存入此异常参数中
配置拦截器,在springMVC-servlet.xml中
<!-- 拦截器 -->
<mvc:interceptors>
<!-- <mvc:interceptor>可以配置多个 -->
<mvc:interceptor>
<!-- 拦截所有请求 -->
<!-- 下面两个标签顺序不能换,否则出错 -->
<mvc:mapping path="/**"/>
<!-- 拦截器完全限定名 -->
<bean class="interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
实现HandlerInterceptor拦截器接口
public class MyInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("最终拦截");
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("后置拦截");
}
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
System.out.println("前置拦截");
return true;
}
}
注:拦截器可以在xml中配置多个,执行顺序为:
- 拦截器①前置拦截–>拦截器②前置拦截
- Controller①–>Controller②
- 拦截器①后置拦截–>拦截器②后置拦截
- 拦截器①最终拦截–>拦截器②最终拦截