springmvc.xml
<!-- 测试拦截器 -->
<mvc:interceptors>
<!--配置某个拦截器;默认是拦截所有请求的; -->
<bean class="com.atguigu.controller.MyFirstInterceptor"></bean>
<!-- 配置某个拦截器更详细的信息 -->
<mvc:interceptor>
<!-- 只来拦截test01请求 -->
<mvc:mapping path="/test01"/>
<bean class="com.atguigu.controller.MySecondInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
MyFirstInterceptor.java
package com.atguigu.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 1、实现HandlerInterceptor接口
* 2、在SpringMVC配置文件中注册这个拦截器的工作;
* 配置这个拦截器来拦截哪些请求的目标方法;
*
*
*/
public class MyFirstInterceptor implements HandlerInterceptor {
/**
* 目标方法运行之前运行
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyFirstInterceptor...preHandle...");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("MyFirstInterceptor...postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("MyFirstInterceptor...afterCompletion");
}
}
MySecondInterceptor.java
package com.atguigu.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 1、实现HandlerInterceptor接口
* 2、在SpringMVC配置文件中注册这个拦截器的工作;
* 配置这个拦截器来拦截哪些请求的目标方法;
*
*
*/
public class MyFirstInterceptor implements HandlerInterceptor {
/**
* 目标方法运行之前运行
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyFirstInterceptor...preHandle...");
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("MyFirstInterceptor...postHandle...");
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("MyFirstInterceptor...afterCompletion");
}
}
InterceptorTestController.java
package com.atguigu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class InterceptorTestController {
@RequestMapping("/test01")
public String test01(){
System.out.println("test01....");
//int i =10/0;
return "success";
}
}
2、多个拦截器
正常流程:
MyFirstInterceptor...preHandle...
MySecondInterceptor...preHandle...
test01....
MySecondInterceptor...postHandle...
MyFirstInterceptor...postHandle...
success.jsp....
MySecondInterceptor...afterCompletion...
MyFirstInterceptor...afterCompletion
异常流程:
1、不放行;
1)、哪一块不放行从此以后都没有;
MySecondInterceptor不放行;但是他前面已经放行了的拦截器的afterCompletion总会执行;
MyFirstInterceptor...preHandle...
MySecondInterceptor...preHandle...
MyFirstInterceptor...afterCompletion
流程:filter的流程;
拦截器的preHandle:是按照顺序执行
拦截器的postHandle:是按照逆序执行
拦截器的afterCompletion:是按照逆序执行;
已经放行了的拦截器的afterCompletion总会执行;