Spring MVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。
在Spring MVC中定义拦截器主要有两种方式:
1、拦截器类实现了Spring的HandlerInterceptor接口,或者是该类继承了实现HandlerInterceptor接口的类,比如HandlerInterceptorAdapter,该 类是为了
选择性的实现HandlerInterceptor中定义的三个方法;
2、实现Spring的WebRequestInterceptor接口,或者是继承了实现WebRequestInterceptor接口的类
拦截器实现拦截功能的步骤:
HandlerInterceptor接口中定义了三个方法,通过这三个方法实现对请求进行拦截处理。
- preHandle(HttpServletRequest request,HttpServletResponse response,Object handle)方法,该方法在请求处理之前调用。一个请求中可以有多个Interceptor,按照申明顺序执行,最先执行的都是perHandle()方法。该方法主要是进行一些前置的初始化操作,也可以在此方法中判断请求要不要继续进行下去。该方法返回boolean类型,如果返回true,则继续调用下一个Interceptor的preHandle()方法,如果是最后一个Interceptor,则会调用请求的controller;如果返回false,请求结束,后续的Interceptor和Controller都不会再执行。
- postHandle(HttpServletRequest request,HttpServletResponse response,Object handle,ModelAndView modelAndView)方法,该方法是在当前Interceptor的preHandle()方法返回true时才被调用。此方法是在当前请求处理之后,即Controller调用之后再执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用。此方法被调用的方向跟preHandle()方法是相反的,即先声明的Interceptor的postHandle()方法反而会后执行。和Struts2的Interceptor执行过程相似,Struts2需手动调用ActionInvocation的invoke方法来触发对下一个Interceptor或Action的调用,然后每一个Interceptor中在Invoke方法调用之前的内容都是按申明顺序执行的,而invoke之后的内容是反向的。
- afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handle,Exception ex)方法,此方法也是需要当前对应的Interceptor的preHandle方法返回true时才被执行。此方法在整个请求结束之后,即DispactcherServlet渲染了对应的视图之后执行,主要作用是进行资源清理。
使用mvc:interceptors标签来申明需要加入到SpringMvc的拦截器主要有两种方式:
1、直接定义一个Interceptor实现类的bean对象。使用这种方式申明的Interceptor拦截器将会对所有的请求进行拦截。
2、使用mvc:interceptor标签进行申明,使用这种方式定义的Interceptor可以通过mvc:mapping子标签来定义需要进行拦截的请求路径。
<mvc:interceptors>
//方式一
<bean class = "com.bis.interceptor.AllInterceptor" />
//方式二
<mvc:interceptor>
<mvc:mapping path = "/test/number.do" />
<bean class = "com.bis.interceptor.LloginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
映射路劲说明:<mvc:mapping path="/*" />这个不是拦截所有的请求,而是拦截根目录下的
第一级请求。