IndexController
@Controller
public class IndexController {
@RequestMapping("/index")
public String toIndex() {
System.out.println("IndexController#toIndex() ---> 处理器方法执行了");
return "index";
}
@RequestMapping("/ok")
public String toOk(){
System.out.println("IndexController#toOk() ---> 处理器方法执行了");
return "ok";
}
}
Interceptor1
@Component
public class Interceptor1 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Interceptor1's preHandle!");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor1's postHandle!");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("Interceptor1's afterCompletion!");
}
}
springmvc.xml
index.html
index
拦截器
ok.html
ok
OK!
当在浏览器中分别访问 localhost:8080/springmvc11/ok
和 localhost:8080/springmvc11/index
时,整个执行流程如下:
localhost:8080/springmvc11/ok
流程步骤:
浏览器请求到达 Spring MVC 的前端控制器 DispatcherServlet
,URL 路径为 /springmvc11/ok
。
springmvc.xml
中的配置查找匹配的 Handler(控制器方法)。/ok
被
明确排除在拦截器之外,因此 Interceptor1 不会拦截此请求。DispatcherServlet 找到 IndexController
中的 toOk()
方法并执行:
@RequestMapping("/ok")
public String toOk(){
System.out.println("IndexController#toOk() ---> 处理器方法执行了");
return "ok";
}
ok
被 ThymeleafViewResolver
解析为 /WEB-INF/thymeleaf/ok.html
。ok.html
的内容OK!
IndexController#toOk() ---> 处理器方法执行了
localhost:8080/springmvc11/index
流程步骤:
浏览器请求到达 DispatcherServlet,URL 路径为 /springmvc11/index
。
/index
符合
的规则,且未被排除,因此 Interceptor1 会拦截此请求。preHandle
方法Interceptor1 的 preHandle
方法被调用:
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Interceptor1's preHandle!");
return true; // 返回 true 表示继续执行后续流程
}
DispatcherServlet 执行 IndexController
中的 toIndex()
方法:
@RequestMapping("/index")
public String toIndex() {
System.out.println("IndexController#toIndex() ---> 处理器方法执行了");
return "index";
}
postHandle
方法在控制器方法返回后,但视图渲染前,Interceptor1 的 postHandle
方法被调用:
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor1's postHandle!");
}
index
被解析为 /WEB-INF/thymeleaf/index.html
。index.html
的内容:拦截器
afterCompletion
方法视图渲染完成后,Interceptor1 的 afterCompletion
方法被调用:
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("Interceptor1's afterCompletion!");
}
Interceptor1's preHandle!
IndexController#toIndex() ---> 处理器方法执行了
Interceptor1's postHandle!
Interceptor1's afterCompletion!
/ok
请求:直接访问控制器方法,不触发拦截器。/index
请求:触发拦截器的完整生命周期(preHandle
→ 控制器 → postHandle
→ 视图渲染 → afterCompletion
)。