Java 中的攔截器和過濾器都是常見的用於攔截和處理系統請求的技術手段,它們的主要作用是在系統的關鍵點上增加通用的處理邏輯,以達到代碼的複用和系統的解耦等目的。
相同點:
- 都可以對請求進行攔截和處理,增加通用的處理邏輯。
- 都可以實現系統的安全控制、日誌記錄、性能優化、緩存控制等功能。
- 都可以通過配置來使用,靈活性高,易於維護和擴展。
不同點:
- 攔截器通常針對於應用程序級別的請求處理,例如在 Spring MVC 中,可以定義攔截器來對請求進行攔截和處理,攔截器可以在請求處理前、處理後或者視圖渲染之前進行處理,可以對請求進行認證、授權、日誌記錄等操作。而過濾器是基於 Servlet 規範的一種技術,可以攔截所有的 Web 請求,對請求進行處理,可以對請求進行編碼轉換、字符集設置、安全控制等操作。
- 攔截器的處理是基於 Java 反射機制實現的,因此可以對方法級別進行攔截,可以在方法執行前後進行處理。而過濾器的處理是基於 Servlet 規範實現的,可以對請求和響應進行處理。
- 攔截器的使用範圍相對較小,主要用於應用程序級別的請求處理,而過濾器的使用範圍更廣,可以對所有的 Web 請求進行攔截和處理。
攔截器和過濾器的執行處於請求生命週期的不同階段:
- 攔截器的執行在請求處理前、處理後或者視圖渲染之前進行處理,主要是針對於應用程序級別的請求處理。在 Spring MVC 中,攔截器的執行是在 HandlerMapping 完成匹配之後,調用處理器之前進行處理的。
- 過濾器的執行是在請求到達 Servlet 容器之前進行處理的,可以對請求進行全面的處理。在 Servlet 生命週期中,過濾器的執行是在 Servlet 被調用之前進行的,也可以在 Servlet 被調用之後進行處理。