基本共識:
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---->