A. 面試官:談談過濾器和攔截器的區別
攔截器(Interceptor)與過濾器(Filter)是兩種在Java Web開發中用於控制和處理請求的重要技術。它們在功能、作用范圍和實現方式上存在區別。
首先,攔截器(Interceptor)主要用於控制Action的執行流程,它只對action請求起作用,即對外訪問路徑。而過濾器(Filter)則更廣泛地應用於幾乎所有的請求,包括css、js等資源文件,因此其作用范圍更為廣泛。
在Servlet和Controller控制器之間執行攔截器操作,而過濾器則在請求進入Tomcat容器之後執行,但在此之前。在web.xml文件中,Filter的載入順序為context-param、listener、filter、servlet,同樣,在請求結束返回時,Filter在Servlet處理完之後執行。
為了實現攔截器功能,需要創建一個實現了HandlerInterceptor介面的類,並在SpringMVC的配置文件中進行配置。這樣,當訪問的請求不為特定路徑時,如/user/doLogin.do會被攔截並重定向到該路徑,但訪問其他頁面不會被攔截。若想讓頁面也被攔截,引入過濾器實現。
過濾器的實現同樣需要創建一個實現了javax.servlet.Filter介面的類,並在web.xml中進行配置。通過Filter,可以對web伺服器管理的所有web資源進行攔截,實現如許可權訪問控制、過濾敏感詞彙、壓縮響應信息等高級功能。
總結而言,攔截器和過濾器在Java Web開發中分別用於控制Action執行流程和管理所有web資源請求。它們都基於AOP編程思想,能夠實現許可權檢查、日誌記錄等功能,但使用范圍、規范存在差異。過濾器的作用更為廣泛,攔截器則聚焦於特定路徑的請求控制。在理解它們的基礎上,開發者可以根據實際需求選擇合適的技術進行應用。