過濾器中起關鍵作用的2個類:ApplicationFilterConfig、ApplicationFilterChain
ApplicationFilterConfig implements FilterConfig, Serializable
ApplicationFilterChain implements FilterChain
package org.apache.catalina.core;
這2個類的包都在org.apache.catalina.core這個保中,說明是有tomcat容器來管理過濾器鏈的。
ApplicationFilterChain 的作用是將一個個分散的過濾器組織起來,它里面有一個數組來保存ApplicationFilterConfig,還有一個過濾器游標,來記錄當前過濾器走到哪兒了。
ApplicationFilterChain類中有一個ApplicationFilterConfig[]數組用來保存一系列過濾器,pos用來保存當前過濾器位置。
ApplicationFilterChain中有2個重要的方法:doFilter和internalDoFilter doFilter方法中調用了internalDoFilter方法,中間增加了一些安全策略。
internalDoFilter方法調當前pos指向的過濾器鏈中的某一個filter的doFilter(request, response, this)方法,中間可能會增加一些安全策略,以及當所有的過濾器調用完了,進行一些收尾清理工作,
包括調用this.servlet.service(request, response)方法,來處理真正的請求,以及清理threadLocal中保存的當前的request和response,為下一次請求做准備。
再把流程梳理一遍:
一個request請求來了,先把自己交給filterChain;
filterChain啟動過濾器鏈,從頭開始,把request交給第一個filter,並把自己傳給filter;
filterChain游標移動,啟動下一個過濾器,如此循環下去...
過濾器游標走到鏈的尾部,filterChain執行收尾工作;