spring mvc - HandlerInterceptor使用
HandlerInterceptor接口
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
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 {
}
}
方法作用:
- preHandle: 如果返回false,请求就不会往下走
- postHandle: preHandle返回为 true 时有效, 可以返回额外的数据model在返回View之前
- afterCompletion: preHandle返回为 true 时有效,视图返回渲染之后,常用于资源清理
示例
现有三个实现了 HandleInterceptor
接口的拦截器:
@Component
public class HandlerItOne implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("HandlerItOne preHandle...");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("HandlerItOne postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("HandlerItOne afterCompletion...");
}
}
@Component
public class HandlerItTwo implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("HandlerItTwo preHandle...");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("HandlerItTwo postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("HandlerItTwo afterCompletion...");
}
}
@Component
public class HandlerItThree implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("HandlerItThree preHandle...");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("HandlerItThree postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("HandlerItThree afterCompletion...");
}
}
配置文件:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<ref bean="handlerItOne"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<ref bean="handlerItTwo"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<ref bean="handlerItThree"/>
</mvc:interceptor>
</mvc:interceptors>
三个拦截器preHandle方法返回true
结果:
HandlerItOne preHandle...
HandlerItTwo preHandle...
HandlerItThree preHandle...
HandlerItThree postHandle...
HandlerItTwo postHandle...
HandlerItOne postHandle...
HandlerItThree afterCompletion...
HandlerItTwo afterCompletion...
HandlerItOne afterCompletion...
可以发现,preHandle 方法是按照顺序执行,而 postHandle 和 afterCompletion 是按照反序执行的
HandlerItOne中的preHandle方法返回false,其他两个拦截器返回true
结果:
HandlerItOne preHandle...
同上
HandlerItTwo中的preHandle方法返回false,其他两个拦截器返回true
结果:
HandlerItOne preHandle...
HandlerItTwo preHandle...
HandlerItOne afterCompletion...
同上
HandlerItThree中的preHandle方法返回false,其他两个拦截器返回true
结果:
HandlerItOne preHandle...
HandlerItTwo preHandle...
HandlerItThree preHandle...
HandlerItTwo afterCompletion...
HandlerItOne afterCompletion...
同上
结论
可以发现,preHandle 方法是按照顺序执行,而 postHandle 和 afterCompletion 是按照反序执行的