56SpringMVC - 拦截器

简介: 56SpringMVC - 拦截器

定义

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

实现HandlerInterceptor接口,如下:

public class HandlerInterceptor1 implements HandlerInterceptor {
  // controller执行后且视图返回后调用此方法
  // 这里可得到执行controller时的异常信息
  // 这里可记录操作日志
  @Override
  public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
      throws Exception {
    System.out.println("HandlerInterceptor1....afterCompletion");
  }
  // controller执行后但未返回视图前调用此方法
  // 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
  @Override
  public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
      throws Exception {
    System.out.println("HandlerInterceptor1....postHandle");
  }
  // Controller执行前调用此方法
  // 返回true表示继续执行,返回false中止执行
  // 这里可以加入登录校验、权限拦截等
  @Override
  public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
    System.out.println("HandlerInterceptor1....preHandle");
    // 设置为true,测试使用
    return true;
  }
}

拦截器配置

上面定义的拦截器再复制一份HandlerInterceptor2,注意新的拦截器修改代码:

System.out.println(“HandlerInterceptor2…preHandle”);

在springmvc.xml中配置拦截器

<!-- 配置拦截器 -->
<mvc:interceptors>
  <mvc:interceptor>
    <!-- 所有的请求都进入拦截器 -->
    <mvc:mapping path="/**" />
    <!-- 配置具体的拦截器 -->
    <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1" />
  </mvc:interceptor>
  <mvc:interceptor>
    <!-- 所有的请求都进入拦截器 -->
    <mvc:mapping path="/**" />
    <!-- 配置具体的拦截器 -->
    <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2" />
  </mvc:interceptor>
</mvc:interceptors>

正常流程测试

浏览器访问地址

http://127.0.0.1:8080/springmvc-web2/itemList.action

运行流程

控制台打印:

HandlerInterceptor1..preHandle..
HandlerInterceptor2..preHandle..
HandlerInterceptor2..postHandle..
HandlerInterceptor1..postHandle..
HandlerInterceptor2..afterCompletion..
HandlerInterceptor1..afterCompletion..
中断流程测试

浏览器访问地址

http://127.0.0.1:8080/springmvc-web2/itemList.action

运行流程

HandlerInterceptor1的preHandler方法返回false,HandlerInterceptor2返回true,运行流程如下:

HandlerInterceptor1…preHandle…

从日志看出第一个拦截器的preHandler方法返回false后第一个拦截器只执行了preHandler方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且Controller也不执行了。

HandlerInterceptor1的preHandler方法返回true,HandlerInterceptor2返回false,运行流程如下:

HandlerInterceptor1..preHandle..
HandlerInterceptor2..preHandle..

从日志看出第二个拦截器的preHandler方法返回false后第一个拦截器的postHandler没有执行,第二个拦截器的postHandler和afterCompletion没有执行,且controller也不执行了。

总结:
  • preHandle按拦截器定义顺序调用
  • postHandler按拦截器定义逆序调用
  • afterCompletion按拦截器定义逆序调用
  • postHandler在拦截器链内所有拦截器返成功调用
  • afterCompletion只有preHandle返回true才调用

目录
相关文章
|
5月前
|
XML Java 数据格式
|
5月前
|
JSON 算法 Java
SpringMVC(五)【拦截器】
SpringMVC(五)【拦截器】
|
6月前
|
数据采集 监控 前端开发
SpringMVC 拦截器
SpringMVC 拦截器
55 0
|
6月前
|
数据安全/隐私保护
SpringMVC拦截器
SpringMVC拦截器
59 0
|
6月前
springMVC之拦截器
springMVC之拦截器
|
Java
SpringMVC-拦截器
SpringMVC-拦截器
58 0
SpringMVC-拦截器
|
前端开发 JavaScript Java
SpringMVC 中的拦截器
SpringMVC 中的拦截器
|
XML 数据格式 容器
springmvc之拦截器
springmvc之拦截器
113 2