攔截器和過濾器
Filter的使用
首先,要使用Filter,必須實現javax.servlet.Filter介面:
init和destroy是default方法,實現類可以不用實現。doFilter必須實現,也就是說,作為一個過濾器,doFilter必須要定義。doFlilter方法中傳進來的FilterChain物件用來呼叫下一個過濾器。攔截器的使用
過濾器與攔截器到底有啥區別呢?
一、實現原理不同
過濾器的實現基於回撥函式攔截器基於Java的反射機制【動態代理】實現。二、使用範圍不同
過濾器是Servlet的規範,需要實現javax.servlet.Filter介面,Filter使用需要依賴於Tomcat等容器。攔截器是Spring元件,定義在org.springframework.web.servlet包下,由Spring容器管理【又有更加豐富的生繆那個週期處理方法,細粒度,且能夠使用Spring中的資源】,不依賴Tomcat等容器。三、觸發時機不同
這一段在HandlerInterceptor類的註釋上可以發現,兩者的觸發時機是不同的:
過濾器:對請求在進入後Servlet之前或之後進行處理。攔截器:對請求在handler【Controller】前後進行處理。
四、執行順序不同
同時配置了過濾器和攔截器的情形:
過濾器的順序每一次都將chain物件傳入,達到最後介面回撥的效果:
攔截器的順序preHandle1 -> preHande2 -> 【Controller】 -> postHandle2 -> postHandle1 -> afterCompletion2 -> afterComplention1
preHandle按照註冊順序,後兩個與註冊順序相反。
一個攔截器的preHandle為false,則之後的所有攔截器都不會執行。一個攔截器的preHandle為true,則這個攔截器的triggerAfterCompletion一定會執行。只有所有的攔截器preHandler都為true,也就是正常執行,postHandle才會執行。
五、控制執行順序方式不同
兩者預設都是使用註冊順序,如果想要認為控制執行的順序,方式略有不同:
過濾器如果想要強制改變,可以使用@Order註解。攔截器如果使用order()方法
總結