SpringMVC拦截器-Interceptor

1.SpringMVC拦截器

Spring MVC 的拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。拦截器也是AOP思想的具体实现。

2.拦截器和过滤器区别

7jpo80.png

3.拦截器实现

  • 创建拦截器类实现HandlerInterceptor接口

  • 配置拦截器

  • 测试拦截器的拦截效果

1.实现接口:

1
2
3
4
5
6
7
8
9
10
11
public class MyHandlerInterceptor1 implements HandlerInterceptor 
{public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("preHandle running...");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("postHandle running...");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("afterCompletion running...");
}

2.配置拦截器:

1
2
3
4
5
6
7
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> //表示拦截所有页面
<bean class="interceptor.MyHandlerInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>

3.测试效果代码:

1
2
3
4
5
6
7
8
9
@RequestMapping("/test")
@ResponseBody
public ModelAndViewquickMethod() throws IOException, ParseException{
System.out.println("目标方法执行...."); //控制台打印一句话
ModelAndViewmodelAndView= new ModelAndView();
modelAndView.addObject("name","111");
modelAndView.setViewName("index");
return modelAndView; //视图返回到index页面
}

接下来访问http://localhost:8080/springmvc/test页面。

观察控制台发现依次执行:

1.preHandle 在执行实体方法之前执行,若结果返回true则放行,若结果返回false,则拦截,后续都不会i执行

2.ModelAndViewquickMethod 实体方法

3.postHandle 在实体方法执行后但视图返回前执行

4.afterCompletion 在视图返回后,最后执行。

4.多拦截器操作:

同上,在编写一个MyHandlerInterceptor2操作,测试执行顺序

7jp45n.png

类似于filter,程序拦截器到达web后会返回。

1.5 拦截器方法说明

7jpICq.png