1. 拦截器
SpringMVC拦截器定义如下:
public interface HandlerInterceptor {
/**
* 在调用自定义的controller之前会调用这个方法,若返回false,
* 将跳过controller方法的调用,否则将进入到controller的方法中。
*/
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
/**
* 调用自定义controller中的方法之后会调用这个方法,此时还没有渲染视图,
* 也就是还没有将结果输出到客户端
*/
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
/**
* 整个请求处理完毕之后,即结果以及输出到客户端之后,调用这个方法,
* 此时可以做一些清理的工作,注意这个方法最后一个参数是Exception类型的,
* 说明这个方法不管整个过程是否有异常,这个方法都会被调用。
*/
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
自定义一个拦截器,实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor.preHandle");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor.postHandle");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor.afterCompletion");
}
}
配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/example/**"/>
<bean class="com.example.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
访问执行顺序如下: