Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口
– preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
– postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
– afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作
举例:
SpringMVC配置文件中增加这一段
<mvc:interceptors>
<!-- 适用于所有请求 -->
<bean id="userInterceptor" class="jv.springmvc.requestmapping.UserInterceptor"></bean>
<mvc:interceptor>
<!-- 通过<mvc:interceptor>可以配置拦截器只拦截指定的path或者不拦截指定的path -->
<mvc:mapping path="/rm/testPojo"/>
<bean id="userInterceptor2" class="jv.springmvc.requestmapping.UserInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器:需实现HandlerInterceptor接口
package jv.springmvc.requestmapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class UserInterceptor implements HandlerInterceptor{
/**
* 调用目标方法之前被执行
* 注:
* 返回值为false,则后续的拦截器和目标方法不会被执行,相反如果返回值是true,则会继续后面的拦截器和目标方法
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("UserInterceptor preHandle");
return true;
}
/**
* INVOKE目标方法之后,渲染视图之前被执行
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("UserInterceptor postHandle");
}
/**
* 渲染视图之后被执行
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("UserInterceptor afterCompletion");
}
}
拦截器执行顺序:
preHandle方法是按照从小到大顺序执行
postHandle方法是按照从大到小顺序执行
afterCompletion方法是按照从大到小顺序执行(但是只包含了preHandle执行过的拦截器)
感兴趣的同学可以DEBUG看看每个拦截器的执行方法中的循环