攔截

所有 HandlerMapping 實現都支援處理器攔截,這在您希望跨請求應用功能時非常有用。HandlerInterceptor 可以實現以下介面/方法:

  • preHandle(..) — 實際處理器執行前的回撥,返回布林值。如果方法返回 true,則繼續執行;如果返回 false,則跳過執行鏈的其餘部分,並且不呼叫處理器。

  • postHandle(..) — 處理器執行後的回撥。

  • afterCompletion(..) — 完整請求處理後的回撥。

對於 @ResponseBodyResponseEntity 控制器方法,響應會在呼叫 postHandle 之前在 HandlerAdapter 中寫入並提交。這意味著更改響應(例如新增額外的頭部)已經太晚了。您可以實現 ResponseBodyAdvice 並將其宣告為一個 Controller Advice bean,或者直接在 RequestMappingHandlerAdapter 上配置它。

請參閱 MVC 配置章節中的攔截器,瞭解如何配置攔截器的示例。您也可以直接在各個 HandlerMapping 實現上使用 setter 方法註冊它們。

攔截器並非理想的安全層,因為可能與註解式控制器的路徑匹配不一致。通常,我們建議使用 Spring Security,或者採用類似的方法與 Servlet 過濾器鏈整合,並儘可能早地應用。