TransmitUserInfoFilter
類繼承自 OncePerRequestFilter
了讨,這是 Spring Framework 提供的一個(gè)過(guò)濾器基類捻激,用于確保在每次請(qǐng)求中只執(zhí)行一次過(guò)濾操作。doFilterInternal
方法是 OncePerRequestFilter
類中的一個(gè)抽象方法前计,必須由子類實(shí)現(xiàn)胞谭。這個(gè)方法封裝了過(guò)濾器的核心邏輯。
在 Spring Boot 應(yīng)用中男杈,doFilterInternal
方法的調(diào)用時(shí)機(jī)如下:
-
請(qǐng)求處理流程中的過(guò)濾階段:當(dāng)一個(gè) HTTP 請(qǐng)求到達(dá) Spring Boot 應(yīng)用時(shí)丈屹,它首先會(huì)被 Servlet 容器接收,然后傳遞給 Spring 的 Dispatcher Servlet伶棒。在 Dispatcher Servlet 分發(fā)請(qǐng)求到具體的控制器之前旺垒,會(huì)經(jīng)過(guò)一系列的過(guò)濾器處理。
TransmitUserInfoFilter
作為這些過(guò)濾器之一肤无,其doFilterInternal
方法會(huì)在這個(gè)階段被調(diào)用先蒋。 -
確保單次執(zhí)行:由于繼承自
OncePerRequestFilter
,TransmitUserInfoFilter
的doFilterInternal
方法保證在一次請(qǐng)求中只被調(diào)用一次宛渐,即使在異步處理或錯(cuò)誤分發(fā)的情況下也是如此竞漾。這是通過(guò)檢查請(qǐng)求屬性來(lái)實(shí)現(xiàn)的,如果發(fā)現(xiàn)請(qǐng)求已經(jīng)被過(guò)濾窥翩,則不會(huì)再次執(zhí)行過(guò)濾邏輯畴蹭。 -
異步請(qǐng)求處理:如果請(qǐng)求是異步的,
OncePerRequestFilter
也支持在異步調(diào)度中正確地只調(diào)用一次doFilterInternal
方法鳍烁。這通過(guò)方法shouldNotFilterAsyncDispatch()
控制叨襟,子類可以重寫這個(gè)方法來(lái)指定是否在異步調(diào)度中調(diào)用過(guò)濾器。 -
錯(cuò)誤處理:在處理請(qǐng)求過(guò)程中發(fā)生錯(cuò)誤時(shí)幔荒,如果配置了錯(cuò)誤分發(fā)糊闽,
OncePerRequestFilter
同樣能夠處理這種情況梳玫。通過(guò)重寫shouldNotFilterErrorDispatch()
方法,可以控制在錯(cuò)誤分發(fā)中是否調(diào)用過(guò)濾器右犹。
總結(jié)來(lái)說(shuō)提澎,TransmitUserInfoFilter
中的 doFilterInternal
方法主要在請(qǐng)求的過(guò)濾階段被調(diào)用,用于在請(qǐng)求處理前后執(zhí)行必要的邏輯念链,如用戶信息的初始化和清理盼忌,確保這些操作在每個(gè)請(qǐng)求中只執(zhí)行一次。