1. 程式人生 > >SpringBoot基礎篇(五)過濾器OncePerRequestFilter

SpringBoot基礎篇(五)過濾器OncePerRequestFilter

     springboot中javax.servlet.Filter原生介面的實現;而Spring的OncePerRequestFilter類實際上是一個實現了Filter介面的抽象類。spring對Filter進行了一些封裝處理。 

        OncePerRequestFilter,顧名思義,它能夠確保在一次請求中只通過一次filter,而需要重複的執行。大家常識上都認為,一次請求本來就只filter一次,為什麼還要由此特別限定呢,往往我們的常識和實際的實現並不真的一樣,經過一番資料的查閱,此方法是為了相容不同的web container,也就是說並不是所有的container都入我們期望的只過濾一次,servlet版本不同,執行過程也不同,因此,為了相容各種不同執行環境和版本,預設filter繼承OncePerRequestFilter是一個比較穩妥的選擇。

1、doFilterInternal()方法原始碼

/**
 * Same contract as for {@code doFilter}, but guaranteed to be
 * just invoked once per request within a single request thread.
 * See {@link #shouldNotFilterAsyncDispatch()} for details.
 * <p>Provides HttpServletRequest and HttpServletResponse arguments instead of the
 * default ServletRequest and ServletResponse ones.
 */
protected abstract void doFilterInternal(
	HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
	throws ServletException, IOException;
#通過上面的該方法的註釋說明,可以發現OncePerRequestFilter過濾器保證一次請求只調用一次doFilterInternal方法;如內部的forward不會再多執行一次

     SpringBoot讓重複執行的filter實現一次執行過程的解決方案,官網地址:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-disable-registration-of-a-servlet-or-filter

【注意】特別需要注意的是,在使用SpringSecurity過程中,SpringSecurity中的Filter被載入了兩次或多次的情況;如果想解決某些過濾器Filter只執行一次,可以採用SpringBoot官網提供的此方案。
..........待完善總....................