拦截器执行流程——补充

拦截器执行流程——补充_第1张图片

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

流程步骤:

1.请求进入 DispatcherServlet

浏览器请求到达 Spring MVC 的前端控制器 DispatcherServlet,URL 路径为 /springmvc11/ok

2.路径匹配与拦截器检查

  • DispatcherServlet 根据 springmvc.xml 中的配置查找匹配的 Handler(控制器方法)。
  • 路径 /ok 被  明确排除在拦截器之外,因此 Interceptor1 不会拦截此请求

3.执行目标控制器方法

DispatcherServlet 找到 IndexController 中的 toOk() 方法并执行:

@RequestMapping("/ok")
public String toOk(){
    System.out.println("IndexController#toOk() ---> 处理器方法执行了");
    return "ok";
}

4.视图解析与渲染

  • 返回的视图名称 ok 被 ThymeleafViewResolver 解析为 /WEB-INF/thymeleaf/ok.html
  • 浏览器显示 ok.html 的内容

OK!

控制台输出:
IndexController#toOk() ---> 处理器方法执行了

二、访问 localhost:8080/springmvc11/index

流程步骤:

1.请求进入 DispatcherServlet

浏览器请求到达 DispatcherServlet,URL 路径为 /springmvc11/index

2.路径匹配与拦截器触发

  • DispatcherServlet 查找匹配的 Handler(控制器方法)。
  • 路径 /index 符合  的规则,且未被排除,因此 Interceptor1 会拦截此请求

3.执行拦截器的 preHandle 方法

Interceptor1 的 preHandle 方法被调用:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("Interceptor1's preHandle!");
    return true; // 返回 true 表示继续执行后续流程
}

4.执行目标控制器方法

DispatcherServlet 执行 IndexController 中的 toIndex() 方法:

@RequestMapping("/index")
public String toIndex() {
    System.out.println("IndexController#toIndex() ---> 处理器方法执行了");
    return "index";
}

5.执行拦截器的 postHandle 方法

在控制器方法返回后,但视图渲染前,Interceptor1 的 postHandle 方法被调用:

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("Interceptor1's postHandle!");
}

6.视图解析与渲染

  • 返回的视图名称 index 被解析为 /WEB-INF/thymeleaf/index.html
  • 浏览器显示 index.html 的内容:

拦截器

7.执行拦截器的 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)。

你可能感兴趣的:(springmvc,java,servlet,开发语言)