05-SpringMVC 拦截器

image-20200620175456961

参考资料:https://spring-mvc.linesh.tw/

1. 拦截器作用

SpringMVC 框架中的拦截器用于对处理器进行预处理后处理的技术。

可以定义拦截器链,连接器链就是将拦截器按着顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。

拦截器和过滤器的功能比较类似,有以下区别:

  • 过滤器是 Servlet 规范的一部分,任何框架都可以使用过滤器技术;
    拦截器是 SpringMVC 框架独有的

  • 过滤器配置了 /*,可以拦截任何资源;
    拦截器只会对控制器中的方法进行拦截

拦截器也是 AOP 思想的一种实现方式。

2. 单个拦截器

自定义拦截器,需要实现 HandlerInterceptor 接口。

  1. 创建自定义拦截器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class MyInterceptor implements HandlerInterceptor {
/**
* 预处理,controller 方法执行前
* 应用:用于身份认证、身份授权
* return true 放行,执行下一个拦截器,如果没有,执行 controller 中的方法
* return false 不放行,即不向下执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true; // true 放行(切记!); false 拦截(不会往下执行)
}

/**
* 后处理方法,controller 方法执行后,方法跳转 success.jsp 执行之前
* 应用:从modelAndView出发:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}

/**
* success.jsp 页面执行后,该方法会执行
* 应用:统一异常处理,统一日志处理
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
  1. 在 springmvc.xml 中配置拦截器
1
2
3
4
5
6
7
8
9
10
11
12
13
<!--配置拦截器-->
<mvc:interceptors>
<!--配置拦截器,多个拦截器时,顺序执行-->
<mvc:interceptor>
<!--要拦截的具体的方法-->
<mvc:mapping path="/user/*"/>
<!--不去拦截的方法
<mvc:exclude-mapping path=""/>
-->
<!--配置拦截器对象-->
<bean class="com.demo.interceptor.MyInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
  1. 测试
1
2
3
4
5
@RequestMapping("/testInterceptor")
public String testInterceptor(){
System.out.println("testInterceptor执行了...");
return "success";
}

3. 多个拦截器

注意:

  • 多个拦截器时,按照 springmvc.xml 配置的顺序执行。
  • (2个拦截器时) 拦截器1 preHandle 不放行,postHandle 和 afterCompletion 不会执行。
  • (2个拦截器时) 拦截器1 preHandle 不放行,拦截器2不执行。

image-20200622192223998

2个拦截器的执行流程:

HandlerInterceptor1…preHandle
HandlerInterceptor2…preHandle

HandlerInterceptor2…postHandle
HandlerInterceptor1…postHandle

HandlerInterceptor2…afterCompletion
HandlerInterceptor1…afterCompletion


05-SpringMVC 拦截器
https://janycode.github.io/2018/06/20/08_框架技术/03_SpringMVC/05-SpringMVC 拦截器/
作者
Jerry(姜源)
发布于
2018年6月20日
许可协议