早期MVC框架将一些通用操作写死在核心控制器中,致使框架灵活性不足、可扩展性降低。
Spring将预处理与后处理功能放到多个拦截器中实现,拦截器可自由选择和组合,增强了灵活性,有利于系统的解耦。SpringMVC的拦截器类似于Servlet中的过滤器Filter,用于对处理器进行预处理和后处理。
1、创建SpringMVC拦截器
创建 SpringMVC 拦截器,只需要实现 HandlerInterceptor 接口即可。 接口中有三个方法需要实现:
- preHandle:该方法在 controller 执行前执行,可以实现对数据的预处理。 如果方法返回 true ,则继续调用下一个资源。如果返回为False,则Handle本身及postHandle/afterCompletion以及后续的拦截器全部都不会再继续执行。
- postHandle:该方法在处理器执行后,生成视图前执行。这里有机会修改视图层数据。
- afterCompletion:Handle执行且视图渲染完成后执行 。最后执行,通常用于记录日志,释放资源,处理异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| package com.lan.interceptor;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
public class MyHandlerInterceptor1 implements HandlerInterceptor{ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { System.out.println("preHandle running..."); return false; } 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、配置SpringMVC拦截器
1 2 3 4 5 6 7
| <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <bean class="com.neusoft.springmvc.interceptor.CorsInterceptor" /> </mvc:interceptor> </mvc:interceptors>
|
![](/../images/p01_07.png)
3、测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| package com.lan.controller;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView;
@Controller public class TestController {
@RequestMapping("/quick23") @ResponseBody public ModelAndView quickMethod23() { System.out.println("目标方法执行...."); ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("name","9999999999"); modelAndView.setViewName("index.jsp"); return modelAndView; } }
|
测试结果:
1 2 3 4
| preHandle running... 目标方法执行.... postHandle running... afterCompletion running...
|
(如果preHandle方法返回值为false,则目标方法不会再执行)