SpringMVC多个拦截器方法的执行顺序
1、在我们程序中定下如下两个拦截器:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/springmvc/helloworld"></mvc:mapping>
<bean class="com.gwolf.springmvc.interceptors.SecondInterceptor"></bean>
</mvc:interceptor>
<bean class="com.gwolf.springmvc.interceptors.FirstInterceptor"></bean>
</mvc:interceptors>

2、声明第一个拦截器:
package com.gwolf.springmvc.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor preHandle--------");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor postHandle--------");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("FirstInterceptor afterCompletion-------------");
}
}

3、声明第二个拦截器SecondInterceptor:
package com.gwolf.springmvc.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class SecondInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("SecondInterceptor preHandle--------");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("SecondInterceptor postHandle--------");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("SecondInterceptor afterCompletion-------------");
}
}

4、声明一个springmvc控制层:
package com.gwolf.springmvc.handlers;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.gwolf.springmvc.domain.Person;
@Controller
@RequestMapping("/springmvc")
public class HelloWorldController {
/**
*使用@RequestMapping 注解来映射请求的URL
*
*返回值会通过视图解析器解析为实际的物理视图,对于InternalResourceViewResolver
*视图解析器,会做如下的解析:通过prefix+returnVal+后缀 这样的方式得到实际的物理视图,然后
*做转发操作。
* /WEB-INF/views/success.jsp
* @return
*/
@RequestMapping(value="/helloworld/{id}",method=RequestMethod.GET)
public String hello(@PathVariable Integer id) {
System.out.println("test rest get:" + id);
return "success";
}
@RequestMapping(value="/helloworld",method=RequestMethod.POST)
public String hello(Person person) {
System.out.println(person);
return "success";
}
@RequestMapping(value="/helloworld/{id}",method=RequestMethod.DELETE)
public String helloDelete(@PathVariable Integer id) {
System.out.println("test rest delete:" + id);
return "success";
}
@RequestMapping(value="/helloworld/{id}",method=RequestMethod.PUT)
public String helloPUt(@PathVariable Integer id) {
System.out.println("test rest put:" + id);
return "success";
}
}

5、执行任意一个jsp页面,查看程序的执行结果:

6、当有多个拦截器时,我们查看这些拦截器的执行顺序,拦截器会根据配置的顺序首先执行preHandle的方法:

