源码分析
public interface HandlerInterceptor {
//处理器方法执行前
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//如果该拦截器执行完后,还调其他拦截器或者还有业务处理,就返回true,否则返回false
return true;
}
//处理器方法执行之后
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
//完成后执行,清除资源
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
对于我们使用拦截器时,需要实现上面的这个接口,并重写此接口中的方法,即可调用对应的拦截方法。
public class YourInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行your拦截器---------preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行your拦截器---------postHandler");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("执行your拦截器---------afterCompletion");
}
}
拦截器的分类
单个拦截器
<!--注册拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--
/**的意思是所有文件夹及里面的子文件夹
/*是所有文件夹,不含子文件夹
/是web项目的根目录
-->
<mvc:mapping path="/**"/>
<!-- 需排除拦截的地址 -->
<!-- <mvc:exclude-mapping path="/userController/login"/> -->
<bean class="com.yara.mvc.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
多个拦截器
<!--注册拦截器-->
<mvc:interceptors>