攔截
所有 HandlerMapping 實現都支援處理器攔截,這在您希望跨請求應用功能時非常有用。HandlerInterceptor 可以實現以下方法:
-
preHandle(..)— 在實際處理器執行之前的回撥,返回一個布林值。如果方法返回true,則繼續執行;如果返回false,則跳過執行鏈的其餘部分,不呼叫處理器。 -
postHandle(..)— 在處理器執行後的回撥。 -
afterCompletion(..)— 在整個請求完成後回撥。
對於 @ResponseBody 和 ResponseEntity 控制器方法,響應會在 HandlerAdapter 中寫入並提交,此時 postHandle 尚未被呼叫。這意味著更改響應(例如新增額外的頭)為時已晚。您可以實現 ResponseBodyAdvice 並將其宣告為 Controller Advice bean,或者直接在 RequestMappingHandlerAdapter 上進行配置。 |
有關如何配置攔截器的示例,請參閱 MVC 配置部分中的攔截器。您也可以透過在各個 HandlerMapping 實現上使用 setter 直接註冊它們。
| 攔截器不適合作為安全層,因為它們與註解的控制器路徑匹配可能存在不匹配。通常,我們建議使用 Spring Security,或者採用類似的方法與 Servlet 過濾器鏈整合,並儘早應用。 |