目录
4.拦截器preHandle,postHandle,afterCompletion
1.拦截器介绍
SpringMVC中的Interceptor拦截器是非常重要的,他的作用就是拦截指定用户的请求,并进行相应的预处理和后处理,他拦截的时间点在(处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行该处理器类之前)。当然,在处理器映射器映射出所要执行的处理类时,已经将拦截器与处理器组合成一个处理器执行链,并返还给了中央调度器。
2.SpringMVC执行流程( 内含拦截器执行流程 )
3.拦截器类
package com.liuhaiyang.handler;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;
/**
* 拦截器
*/
public class Myhandler implements HandlerInterceptor {
/**
* preHandle:预先处理请求的方法 。相当于总开关 参数:Object handler:被拦截的控制器对象(Mycontroller)
* 返回值:Boolean 当为真时,请求正确,可以被Controller处理,程序正常执行。
* 当为假时,请求不能被处理,控制器方法不会执行。请求到此截止。
* 特点:1.预处理方法的执行时间:在控制器方法之前先执行的. 2.可以对请求做处理,可以做登陆检查,全限的判断,统计数据等等
* 3.决定请求是否被执行
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("=====MyHandler拦截器的preHandler====");
// request.getRequestDispatcher("/tips.jsp").forward(request,response);
return true;
}
/**
* postHandler:后处理方法 参数:Object handler:被拦截的控制器对象(MyController)
* ModelAndView mv:控制器方法的返回值(请求的执行结果)
* 特点:1.在控制器方法之后执行的。 2.能获取到控制器方法的执行结果。可以修改原来的执行结果
* 可以修改数据,也可以修改视图。 3.可以做对请求的二次处理
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView mv) throws Exception {
System.out.println("=====MyHandler拦截器的postHandler====");
}
}
/**
* afterCompletion:最后执行的方法 参数:Object handler:被拦截的控制器对象(MyController) Exception ex:异常对象
* 特点:1.在请求处理完成后执行的,请求处理完成的标志 是视图处理完成,对试图执行forward操作后
* 2.可以做程序最后要做的工作,释放内存,清理临时变量
* 3.方法的执行条件:1)当前的拦截器它的preHandler方法必须执行。 2)preHandler必须返回true
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("=====MyHandler拦截器的afterCompletion====");
}
}
4.拦截器preHandle,postHandle,afterCompletion
preHandle
调用时间:Controller方法处理之前
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
若返回false,则中断执行,注意:不会进入afterCompletion
postHnadle
调用前提:preHandle返回true
调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作。
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。
备注:postHandle虽然post打头,但post、get方法都能处理
afterCompletion
调用前提:preHandle返回true
调用时间:DispatcherServlet进行视图的渲染之后
多用于清理资源