HandlerInterceptor
工作流接口,允許定製處理程序執行鏈。應用程序可以爲某些處理程序組註冊任意數量的現有或自定義攔截器,以添加公共預處理行爲,而無需修改每個處理程序實現。
在適當的HandlerAdapter觸發處理程序本身的執行之前,將調用HandlerInterceptor。這種機制可以用於預處理方面的大量領域,例如授權檢查,或者常見的處理程序行爲,如區域設置或主題更改。它的主要目的是允許分解出重複的處理程序代碼。
在異步處理場景中,當主線程退出時,處理程序可能在單獨的線程中執行,而不呈現或調用{@code postHandle}和{@code afterCompletion}回調。當併發處理程序執行完成時,爲了繼續呈現模型,請求被回調,並再次調用此契約的所有方法。有關更多選項和詳細信息,請參見{@code org.springframework.web.servlet。AsyncHandlerInterceptor}
通常,每個HandlerMapping bean定義一個攔截器鏈,共享其粒度。要將某個攔截器鏈應用於一組處理程序,需要通過一個HandlerMapping bean映射所需的處理程序。攔截器本身在應用程序上下文中定義爲bean,由映射bean定義通過其“攔截器”屬性引用(在XML中:a < list >)& lt; ref>)。
HandlerInterceptor基本上類似於Servlet過濾器,但與Servlet過濾器不同的是,它只允許自定義預處理和自定義後處理,選項是禁止執行處理程序本身。過濾器更強大,例如,它們允許交換傳遞給鏈的請求和響應對象。注意過濾器是在web中配置的。xml,應用程序上下文中的HandlerInterceptor。
作爲一個基本準則,與HandlerInterceptor實現相關的細粒度預處理任務是候選的,特別是經過驗證的公共處理程序代碼和授權檢查。另一方面,過濾器非常適合於請求內容和視圖內容處理,比如多部分表單和GZIP壓縮。這通常顯示何時需要將篩選器映射到某些內容類型(例如圖像)或所有請求。
有關係的類
@see HandlerExecutionChain#getInterceptors @see org.springframework.web.servlet.handler.HandlerInterceptorAdapter @see org.springframework.web.servlet.handler.AbstractHandlerMapping#setInterceptors @see org.springframework.web.servlet.handler.UserRoleAuthorizationInterceptor @see org.springframework.web.servlet.i18n.LocaleChangeInterceptor @see org.springframework.web.servlet.theme.ThemeChangeInterceptor @see javax.servlet.Filter
preHandle方法
前置處理:可以在此方法中確定用戶是否登錄、權限級別等,根據用戶情況返回檢測結果
/**
* 攔截處理程序的執行。在HandlerMapping確定適當的處理程序對象之後調用,但是在HandlerAdapter調用處
* 理程序之前調用。
* 使用此方法,每個攔截器可以決定中止執行鏈,通常發送HTTP錯誤或編寫自定義響應。
* {@link org.springframework.web.servlet.AsyncHandlerInterceptor}。
* @param請求當前HTTP請求
* @param響應當前HTTP響應
* 爲類型和/或實例計算選擇要執行的處理程序
* 如果執行鏈應該繼續執行下一個攔截器或處理程序本身,則返回{@code true}。否則,DispatcherServlet
* 假定這個攔截器已經處理了響應本身。
* @拋出異常以防出錯
*/
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
postHandle方法
後置處理:可以在此方法中進行頁面的跳轉等處理
/**
* 攔截處理程序的執行。
* 在HandlerAdapter實際調用處理程序之後調用,但在DispatcherServlet呈現視圖之前調用。
* DispatcherServlet在執行鏈中處理一個處理程序,該執行鏈由任意數量的攔截器組成,處理程序本身位於執行鏈的末尾。
* <strong>注意:</strong>特別注意異步請求處理。有關更多細節,請參見{@link org.springframework.web.servlet.AsyncHandlerInterceptor}。
* @param request 當前HTTP請求
* @param response 當前HTTP響應
* @param handler (或{@link HandlerMethod})用於類型和/或實例檢查的啓動異步執行的
* @param modelAndView {@code modelAndView}(也可以是{@code null})
* @throws Exception 拋出異常以防出錯
*/
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
afterCompletion方法
用戶退出後:用於刪除token信息等
/**
* 請求處理完成後回調,即呈現視圖後回調。
* 將在處理程序執行的任何結果上調用,從而允許進行適當的資源清理。
* 與{@code postHandle}方法一樣,該方法將在鏈中的每個攔截器上以相反的順序調用,因此第一個攔截器將是最後一個被調用的攔截器。
* {@link org.springframework.web.servlet.AsyncHandlerInterceptor}。
* @param request 當前HTTP請求
* @param response 當前HTTP響應
* @param handler 用於類型和/或實例檢查的啓動異步執行的@param處理程序處理程序(或{@link HandlerMethod})
* @param ex 在處理程序執行時拋出(如果有的話)
* @throws Exception 拋出異常以防出錯
*/
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}