HandlerInterceptor拦截器
1、HandlerInterceptor拦截器的介绍
在JavaWeb中,我们使用Filter过滤器对目标资源进行拦截操作.
在SpringMVC框架中,使用HandlerInterceptor来对访问的资源进行拦截操作.
HandlerInterceptor的使用和Filter非常接近,使用的步骤如下:
1、编写一个类去实现HandlerInterceptor接口
2、实现里面的方法
3、到SpringMVC的配置文件中,配置拦截器拦截哪些路径.
2、单个HandlerInterceptor拦截器的示例
1、编写一个类去实现HandlerInterceptor接口
2、到Spring的容器配置文件中去配置拦截器,让SpringMVC知道都拦截哪些目标方法
拦截器类:
public class FirstHandlerInterceptor implements HandlerInterceptor {/*** preHandle 是在目标资源之前执行 <br/>*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(" preHandle() 是在目标资源之前执行 ");// 它决定 是否 放行// return true;执行目标资源// return false; 不执行目标资源return true;}/*** postHandle 在目标资源之后执行 <br/>*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(" postHandle() 在目标资源之后执行 ");}/*** afterCompletion 在页面渲染完成之后执行*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(" afterCompletion() 在页面渲染完成之后执行 ");}
}
正常情况下, 拦截器代码执行顺序。
preHandle() 是在目标资源之前执行 hello 方法被调用了 postHandle() 在目标资源之后执行 ok.jsp 页面渲染了***** afterCompletion() 在页面渲染完成之后执行
在SpringMVC配置文件中配置:
<!--mvc:interceptors 是配置多个拦截器
-->
<mvc:interceptors><!--配置拦截器对象 , 它默认可以拦截全部请求<bean class="com.atguigu.interceptor.FirstHandlerInterceptor" />--><mvc:interceptor><!-- 拦截 /hello 请求 ( 设置拦截路径 )--><mvc:mapping path="/hello"/><!-- 拦截器类的全类名 --><bean class="com.atguigu.interceptor.FirstHandlerInterceptor" /></mvc:interceptor>
</mvc:interceptors>
3、单个拦截器异常时的执行顺序
一:目标方法前返回false的情况:
1、preHandler方法 返回false
2、目标方法 不执行
3、postHandler方法 不执行
4、渲染的页面 不执行
5、afterCompletion页面渲染完成! 不执行
二:preHandler返回true的情况,目标方法异常
1、preHandler方法 返回true
2、目标方法 异常
3、postHandler方法 不执行
4、渲染的页面 渲染异常页面
5、afterCompletion页面渲染完成! 执行
三:目标方法前返回true的情况,目标方法后异常
1、preHandler方法 返回true
2、目标方法 执行
3、postHandler方法 产生异常
4、渲染的页面 渲染异常页面
5、afterCompletion页面渲染完成! 执行
四:目标方法前返回true的情况,渲染页面异常
1、preHandler方法 返回true
2、目标方法 执行
3、postHandler方法 执行
4、渲染的页面 发生异常
5、afterCompletion页面渲染完成! 执行
4、多个拦截器的执行介绍:
public class SecondHandlerInterceptor implements HandlerInterceptor {/*** preHandle 是在目标资源之前执行 <br/>*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Second preHandle() 是在目标资源之前执行 ");// 它决定 是否 放行// return true;执行目标资源// return false; 不执行目标资源return true;}/*** postHandle 在目标资源之后执行 <br/>*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Second postHandle() 在目标资源之后执行 ");}/*** afterCompletion 在页面渲染完成之后执行*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("Second afterCompletion() 在页面渲染完成之后执行 ");}}多个拦截器的配置:<!--mvc:interceptors 是配置多个拦截器
-->
<mvc:interceptors><!--配置拦截器对象 , 它默认可以拦截全部请求<bean class="com.atguigu.interceptor.FirstHandlerInterceptor" />--><mvc:interceptor><!-- 拦截 /hello 请求 ( 设置拦截路径 )--><mvc:mapping path="/hello"/><!-- 拦截器类的全类名 --><bean class="com.atguigu.interceptor.FirstHandlerInterceptor" /></mvc:interceptor><!--配置一个拦截器--><mvc:interceptor><!-- 拦截 /hello 请求 ( 设置拦截路径 )--><mvc:mapping path="/hello"/><!-- 拦截器类的全类名 --><bean class="com.atguigu.interceptor.SecondHandlerInterceptor" /></mvc:interceptor>
</mvc:interceptors>
正常情况下, 多个HandlerInceptor的执行顺序和Filter差不多
First preHandle() 是在目标资源之前执行
Second preHandle() 是在目标资源之前执行 hello 方法被调用了
Second postHandle() 在目标资源之后执行
First postHandle() 在目标资源之后执行 ok.jsp 页面渲染了*****
Second afterCompletion() 在页面渲染完成之后执行
First afterCompletion() 在页面渲染完成之后执行
如果是在异常的情况下:
如果一个拦截器的前置方法preHandle()已经放行,则这个拦截器的页面渲染完成 afterCompletion() 一定执行