其实拦截器就是我们的AOP编程。拦截器在我们的实际项目中实用性比较大的,比如:日志记录,权限过滤,身份验证,性能监控等等。下面就简单的来研究一下拦截器:
public interface HandlerInterceptor {
//在处理器适配器执行前调用 前面讲过 为各种处理器适配 通俗的讲意思就是说在执行controller的方法
//之前执行,返回true或者是false,true代表的是执行和面的逻辑,即执行后面的处理器或者拦截器
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
//在执行完适配的调用方法后,生成视图之前执行,官方是这样解析的:
// but before the DispatcherServlet renders the view.
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; //在所以的操作以后执行 void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
很明显的看出来这是一个接口,我们在平时使用的时候,也是直接实现接口的方式的,具体每一个方法的作用也都将了一下,为了更好了理解这几个方法调用的时机,我们来进行测试一下:
拦截器:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("<===========preHandle=============>"+System.currentTimeMillis()); return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("<===========postHandle=============>"+System.currentTimeMillis()); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("<===========afterCompletion=============>"+System.currentTimeMillis()); }
controller:
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mv=new ModelAndView(); System.out.println("Controller"+System.currentTimeMillis()); mv.setViewName("index"); return mv; }
jsp:
<%
long endTime=System.currentTimeMillis();
System.out.println("Jsp:"+endTime);
%>
执行完以后控制台打印:
<===========preHandle=============>1451574182055 Controller1451574182055 <===========postHandle=============>1451574182055 Jsp:1451574182179 <===========afterCompletion=============>1451574182179
这也验证了上面说法。
也许会有这样的疑惑,业务需求可能只需要继承一个方法,那怎么办,看其他几个比较烦人(处女座)。这时候我们就可以通过继承HandlerInterceptorAdapter 这个抽象类了,
这个不用解释了吧,你可以选择继承任意几个来完成自己的业务逻辑。