概念
- 拦截器,全称处理器拦截器,类似过滤器(Filter)
- 基于反射机制实现,用于对处理器进行预处理和后处理
拦截器原理
前端控制器收到请求之后,通过映射处理器获取处理流程链,处理流程链包含:拦截器和处理器。
- 如果没有配置拦截器,那么直接由处理器处理请求
- 如果配置了拦截器,那么按照配置文件顺序执行拦截器及处理器 执行流程:
拦截器的配置及使用
框架提供了拦截器接口,通过实现 HandlerInterceptor 接口可以完成拦截器的实现。
至少要实现三个方法:
- preHandle():预处理回调方法,实现处理器的预处理:在处理器之前处理
- postHandle():后处理回调方法,处理器处理后,返回视图之前
- afterCompletion():整个请求处理完毕回调方法,即返回视图之后
拦截器的实现
- 实现 HandlerInterceptor 接口,编写自定义拦截器
- 配置文件
- 编写控制器验证效果
代码演示
/**
* 自定义拦截器
*/
public class KgcInterceptor implements HandlerInterceptor {
@Override
//预处理方法,在控制器处理请求之前执行
//返回值为true,请求会被控制器继续执行,为false,请求会被截断,不会被控制器执行
//object参数就是处理请求的目标控制器
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
System.out.println("preHandle执行了");
KgcController kgc = (KgcController) obj;
kgc.setUserName("张三");
System.out.println("请求处理开始的时间" + System.currentTimeMillis());
return true;
}
@Override
//后处理方法,控制器处理请求之后,返回视图之前:返回视图指的是modelandview被视图解析器解析之前
//modelandview对象是请求最终返回的模型视图对象,与控制器当中返回的是同一个对象
public void postHandle(HttpServletRequest request, HttpServletResponse response,Object obj, ModelAndView mav) throws Exception {
System.out.println("postHandle执行了");
System.out.println(obj.toString());
Map<String, Object> model = mav.getModel();
Object object = model.get("sayHelloMsg");
model.put("sayHelloMsg", "这是被拦截器修改后的业务数据");
//添加拦截器的数据到modelandview对象中
mav.addObject("postHandleMsg","这是postHandle拦截器添加的数据");
}
@Override
//后处理方法,返回视图之后执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object obj, Exception exception) throws Exception {
System.out.println("afterCompletion执行了");
System.out.println(obj.toString());
//常用的一个功能是用来监控请求处理的时间,进而可以判断效率等
System.out.println("请求处理结束的时间" + System.currentTimeMillis());
}
}
配置文件