Spring MVC 拦截器---27
拦截器:
是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强;
使用场景:解决请求的共性问题,如:乱码问题、权限验证问题等
拦截器和过滤器
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。 ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。 ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。 ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。 ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑
实现SpringMVC拦截器的三个步骤
1:创建一个实现HandlerInterceptor接口,并实现接口的方法的类
public class TestInterceptor implements HandlerInterceptor { //请求前,带返回值(true:执行请求后和结束的方法, //false:表示执行到请求就拦截下来不再执行请求后的结果) //Object handler代表被拦截的目标对象。 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("执行到了preHandle方法!"); return true; } //请求后,modelAndView:返回的视图 .setViewName(“/视图.jsp”) //ModelAndView对象可以改变发往的视图或修改发往视图的信息。 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("执行到了postHandle方法!"); modelAndView.setViewName("course_admin/file"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("执行到了afterCompletion方法!"); } }
2:将创建的拦截器注册到SpringMVC的配置文件中实现注册
3:配置拦截器的拦截规则:
<!-- 注册拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="//courses"/> <bean class="com.imooc.mvcdemo.controller.TestInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
=================================================================================拦截器的方法介绍
1:preHandle:请求前,带返回值(true:执行请求后和结束的方法,false:表示执行到请求就拦截下来不再执行请求后的结果Object arg代表被拦截的目标对象。)2:postHandle:请求后,modelAndView:返回的视图 .setViewName(“/视图.jsp”)postHandle()方法的ModelAndView对象可以改变发往的视图或修改发往视图的信息。3:afterCompletion()方法表示视图显示之后在执行该方法。(一般用于资源的销毁)
多个拦截器协同时工作流程图
拦截器的其它实现方式:
(1)拦截器的类还可以通过实现WebRequestInterceptor(HandlerInterceptor)接口来编写<br> (2)向SpringMVC框架注册的写法不变<br> (3)弊端:preHandler方法没有返回值,不能终止请求 Ps:建议使用功能更强大的实现方式,实现HandlerInterceptor接口。