TransmitUserInfoFilter
类继承自 OncePerRequestFilter
,这是 Spring Framework 提供的一个过滤器基类,用于确保在每次请求中只执行一次过滤操作。doFilterInternal
方法是 OncePerRequestFilter
类中的一个抽象方法,必须由子类实现。这个方法封装了过滤器的核心逻辑。
在 Spring Boot 应用中,doFilterInternal
方法的调用时机如下:
-
请求处理流程中的过滤阶段:当一个 HTTP 请求到达 Spring Boot 应用时,它首先会被 Servlet 容器接收,然后传递给 Spring 的 Dispatcher Servlet。在 Dispatcher Servlet 分发请求到具体的控制器之前,会经过一系列的过滤器处理。
TransmitUserInfoFilter
作为这些过滤器之一,其doFilterInternal
方法会在这个阶段被调用。 -
确保单次执行:由于继承自
OncePerRequestFilter
,TransmitUserInfoFilter
的doFilterInternal
方法保证在一次请求中只被调用一次,即使在异步处理或错误分发的情况下也是如此。这是通过检查请求属性来实现的,如果发现请求已经被过滤,则不会再次执行过滤逻辑。 -
异步请求处理:如果请求是异步的,
OncePerRequestFilter
也支持在异步调度中正确地只调用一次doFilterInternal
方法。这通过方法shouldNotFilterAsyncDispatch()
控制,子类可以重写这个方法来指定是否在异步调度中调用过滤器。 -
错误处理:在处理请求过程中发生错误时,如果配置了错误分发,
OncePerRequestFilter
同样能够处理这种情况。通过重写shouldNotFilterErrorDispatch()
方法,可以控制在错误分发中是否调用过滤器。
总结来说,TransmitUserInfoFilter
中的 doFilterInternal
方法主要在请求的过滤阶段被调用,用于在请求处理前后执行必要的逻辑,如用户信息的初始化和清理,确保这些操作在每个请求中只执行一次。