Here is my latest discovering. Through debugging, I found that the code is reentered, and all entries are via the main thread. This might be related to the content of my code. I obtained the ServletContext through ApplicationContext, then retrieved all filters in the servlet container, and subsequently obtained all HandlerInterceptors via reflection.