欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

拦截器

程序员文章站 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";
	}

}

 

相关标签: SpringMVC 拦截器