一、自定义拦截器
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