Spring MVC中的拦截器主要用于拦截用户请求并做出相对应事务处理,拦截器的应用场景有权限验证、记录请求信息的日志、判断用户是否登录。
拦截器的定义
- 实现HandlerInterceptor接口(用的最多)
- 实现WebRequestInterceptor接口
1. 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:
preHandler会在控制器方法执行前执行,我们发送一个控制器请求url,最终在adapter调用controller方法,在执行adapter之前就执行praHandle方法。返回值为boolean值,表示是否中断或者说继续后面的操作,如果返回值为true表示,表示springmvc的工作流程继续往下面走,如果为fasle就不走了。在拦截器对请求处理完成之后,还要调用其他的拦截器或者还要进行其他业务处理,那么就设置返回值为true,如果这一地方出了问题,比如权限验证没有通过,那么就为false。
- postHandle:
在控制器方法调用之后,在视图解析对象之前执行,可以对modelAndView做一些修改动作,
- afterCompletion:
在所有的请求完成,包括视图渲染,来执行这个afterCompletion方法,可以用这个方法做资源清理、日志记录。
2. 拦截器配置
xml文件配置拦截器
<mvc:interceptors>
<bean class="cn.gp.mvc.MvcController"/>
<mvc:interceptor>
<mvc:mapping path="/mvc"/>
<bean class="cn.gp.mvc.MvcController"/>
</mvc:interceptor>
</mvc:interceptors>
3. 拦截器的执行顺序
分为两种情况,第一种情况是在开发过程中只有一个拦截器,第二种情况,开发过程中存在多个拦截器;
单个拦截器:
多个拦截器:
4. 拦截器的简单案例
public class mvcInterceptor1 implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行了"+this.getClass().getSimpleName()+"的preHandle=======================");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("执行了"+this.getClass().getSimpleName()+"的postHandle=======================");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("执行了"+this.getClass().getSimpleName()+"的afterCompletion=======================");
}
}