Springmvc攔截器分析

基本共識:
interceptor有三個方法:
    preHandle() 如果處理器映射器找到請求的controller則第一個攔截器的該方法
        執行,後邊的攔截器需要前邊的 return true; 纔會執行;
    postHandle() 這個方法的執行時機是handler方法體邏輯執行結束,返回modelAndView
        之前; 可以認爲這個方法時內嵌在handler方法 return 語句之前;
    afterCompletion() 如果它所在的 攔截器的 preHandle()方法執行了,則該方法一定
        執行,可以認爲這個方法和 preHandle() 是一進一出對稱的,如果 preHandle() 
        return true; 放行進入下一個環節,則這個方法一定會執行從下一個環節退出,
        否則,不執行;


1. 未登錄訪問 http://localhost:8080/springmvc-web2/item/itemList.action
    ----> 處理器映射器查找到controller之後,返回攔截器鏈,和handler
    ---->Interceptor1 preHandle......
    ---->Interceptor2 preHandle......
    ---->loginInterceptor1 的 preHandle()方法執行:判斷髮現url中不包含 "login" 
        就是說這個不是登錄,你不登錄訪問資源那就是已經登錄了,我就從session中嘗試
        獲取用戶名,發現沒有獲取到,
        // c)如果用戶未登錄,跳轉到登錄頁面。
        response.sendRedirect(request.getContextPath() + "/user/showlogin");
        return false;
    ---->Interceptor2 afterCompletion......
    ---->Interceptor1 afterCompletion......
    
    ---->重定向 "/user/showlogin" 再次訪問: 處理器映射器找到 "資源映射" 返回
        interceptor鏈 和 handler;
    ---->Interceptor1 preHandle......
    ---->Interceptor2 preHandle......
    ---->loginInterceptor1 的 preHandle()方法執行: 判斷url中含有 "login" 則
        return true;
        
    ----> "/user/showlogin" handler執行,結束之前
    ---->loginInterceptor postHandle......
    ---->Interceptor2 postHandle......
    ---->Interceptor1 postHandle...... 
    ---->handler執行結束,將ModelAndView返回給處理器適配器
    
    ---->loginInterceptor afterCompletion......
    ---->Interceptor2 afterCompletion......
    ---->Interceptor1 afterCompletion......
    
    ---->攔截器執行完畢,頁面跳轉
        
        
2. 在有攔截器時一個完整的請求和響應執行流程:
    request---->DispatcherServlet---->HandlerMapping---->攔截器鏈,handler---->
    DispatcherServlet---->HandlerAdapter---->攔截器鏈的 preHandle()方法一頓執行---->
    handler()方法執行,在返回ModelAndView之前,攔截器鏈的 postHandle()方法逆序一頓
    執行---->handler方法執行完畢,返回modelAndView---->
        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章