一、自定义拦截器

Spring MVC实现自定义拦截器分为两步:

1、一个普通类实现HandlerInterceptor接口,该接口有三个方法。

2、在配置文件中配置项相对于的拦截器配置

例子如下:

1)、普通类:

package com.gl.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * spring mvc 自定义拦截器
 * @author Administrator
 *
 */
public class FirstInterceptor implements HandlerInterceptor {
	
	//    1.程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行。
//    2.在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应。
//    3.在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("第一执行,返回true才会执行下面的,第二执行是执行controller");
        return true;
    }
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception {
        System.out.println("第三执行,执行后,再执行spring mvc的DispatcherServlet进行渲染视图");
    }
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("第五步执行,是在springmvc渲染视图后才执行的");
    }

}

2)、配置文件:

<mvc:interceptors>
    	<!-- 配置自定义拦截器,对所有请求都有效 -->
    	<bean class="com.gl.interceptor.FirstInterceptor"></bean>
    </mvc:interceptors>

二、配置多个拦截器

1、再新建一个普通类,实现HandlerInterceptor接口

2、在配置文件中配置如下:

<mvc:interceptors>
    	<!-- 配置自定义拦截器,对所有请求都有效 -->
    	<bean class="com.gl.interceptor.FirstInterceptor"></bean>
    	<!-- 配置拦截器起作用的路径(也可以配置不起作用的路径) -->
    	<mvc:interceptor>
    		<mvc:mapping path="/testFileupload"/>
    		<bean class="com.gl.interceptor.SecondInterceptor"></bean>
    	</mvc:interceptor>
</mvc:interceptors>

补充:如何配置不起作用的路径的拦截器?如下:

<!-- 配置拦截器不起作用的路径 -->
<mvc:interceptor>
    	<mvc:mapping path="/**"/>
    	<mvc:exclude-mapping path="/testFileupload"/>
    	<bean class="com.gl.interceptor.SecondInterceptor"></bean>
</mvc:interceptor>

三、多个拦截器之间的执行顺序

执行程序,效果如下:(第二个拦截器的类我就不写了,写法和第一个类一样的)

[FirstInterceptor] : preHandle // 这个是拦截器的方法名
[SecondInterceptor] : preHandle
testFileupload //这个是执行的方法。
[SecondInterceptor] : postHandle
[FirstInterceptor] : postHandle
[SecondInterceptor] : afterCompletion
[FirstInterceptor] : afterCompletion

如上可以看出,也可以跟进源码看看,可以得出拦截器中方法的执行顺序:

preHandle方法:配置在前的拦截器先执行、配置在后的拦截器后执行。

postHandle方法:配置在前的拦截器后执行、配置在后的拦截器先执行。

afterCompletion方法:配置在前的拦截器后执行、配置在后的拦截器先执行。

四、如果有个拦截器中的preHandle方法返回值是false呢,多个拦截器该怎么执行呢?

1、修改第一个拦截器中的preHandle方法的返回值为false,执行效果如下:

[FirstInterceptor] : preHandle //这个是拦截器的方法名

2、修改第二个拦截器中的preHandle方法的放回值为false,执行效果如下:

[FirstInterceptor] : preHandle //这个是拦截器的方法名
[SecondInterceptor] : preHandle
[FirstInterceptor] : afterCompletion