拦截器
程序员文章站
2022-03-18 16:14:16
...
重难点: 掌握拦截器的配置及使用
拦截器 : ·拦截器,全称处理器拦截器,类似过滤器(Filter)
·基于反射机制,用于对处理器进行预处理和后处理(过滤器是基于Servlet)
拦截器原理:
前端控制器 收到请求后,通过映射处理器获取处理流程链,
处理流程链包含:拦截器和处理器
·如果没有配置拦截器,那么直接由处理器处理请求;
·如果配置了拦截器,那么按照配置文件顺序执行拦截器及处理器
拦截器执行流程
拦截器的配置及使用
·框架提供了拦截器接口,通过实现HandlerInterceptor 接口可以完成拦截器的实现
·三个方法:
·preHandler() : 预处理回调方法,实现处理器的预处理
·postHandler() : 后处理回调方法,返回视图之前
·afterCompletion() : 整个请求处理完毕回调方法,返回视图之后
拦截器的实现
-
实现HandlerInterceptor 接口,编写自定义拦截器
Implements HandlerInterceptor
/**
* 自定义拦截器
* @author Administrator
*
*/
public class KgcInterceptor implements HandlerInterceptor {
// 预处理方法,在控制器处理请求之前执行
// 返回值为true :请求会被处理器继续执行
// 返回值false : 请求会被截断
// object 参数是处理请求的目标控制器
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object obj) throws Exception {
System.out.println("preHandle执行了");
// System.out.println("请求处理开始时间:"+System.currentTimeMillis());
System.out.println(obj.toString());
KgcController kgc = (KgcController)obj;
kgc.setUserName("课工场");
return true;
}
// 后处理方法,处理请求之后,返回视图之前执行
// modelAndView 对象是请求最终返回的模型视图对象,与控制器当中返回的是同一个
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object obj, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle执行了");
// 添加了拦截器数据到 ModelAndView 对象中
// modelAndView.addObject("postHandlerMsg","这是postHandler添加的数据");
// 修改控制器返回的业务数据
// Map<String,Object> model = modelAndView.getModel();
// String msg = model.get("sayHelloMsg").toString();
// System.out.println("控制器添加的数据:"+msg);
// model.put("sayHelloMsg", "这是postHandler修改后的数据");
System.out.println(obj.toString());
}
// 后处理方法,处理请求之后,返回视图之后哦执行
// 可以用来监控方法执行效率以及性能
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse response, Object obj, Exception exception)
throws Exception {
System.out.println("afterCompletion执行了");
// System.out.println("请求处理结束时间:"+System.currentTimeMillis());
System.out.println(obj.toString());
}
}
-
配置文件
<mvc:interceptors>
<!-- 拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/kgc/*"/>
<bean class="com.kgc.interceptors.KgcInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
注意: 如果需要拦截所有请求 <mvc:mapping path=”/**”
一个 * 表示: 匹配0或者任意数量的字符
两个 * 表示: 匹配0或者更多的目录
-
编写控制器验证效果
/**
* 验证拦截器方法的执行顺序
* @author Administrator
*
*/
@Controller
@RequestMapping("/kgc")
public class KgcController {
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@RequestMapping("sayHello.do")
public String sayHello(Model model){
System.out.println("sayHello执行了");
model.addAttribute("sayHelloMsg","你好"+userName);
// model.addAttribute("sayHelloMsg", "这是sayHello的数据");
return "success";
}
}