Spring Web请求分发与OncePerRequestFilter困惑:为何提及多Servlet?
关于OncePerRequestFilter的误区解答
你忽略了两个关键要点:
同一Servlet内部的多次转发/包含也会触发过滤器重复执行
虽然Spring Web核心只有DispatcherServlet,但请求在它内部也可能通过RequestDispatcher进行多次转发或包含操作——比如在Controller里调用request.getRequestDispatcher("/other-controller").forward(req, res),或者在视图层用<jsp:include>引入其他资源,这些场景都会让请求再次经过过滤器链。如果不用OncePerRequestFilter,你的过滤器逻辑会被执行多次,这显然不是我们想要的。Spring Web中并非只能存在DispatcherServlet
你可以手动注册自定义Servlet,比如处理特定静态资源的DefaultServlet,或者自己编写的业务Servlet。当请求通过RequestDispatcher转发到这些非DispatcherServlet的组件时,OncePerRequestFilter就能保证整个请求生命周期内过滤器只运行一次,避免重复执行的问题。
简单来说,OncePerRequestFilter的核心价值是绑定请求生命周期,而非区分不同Servlet——只要是同一次请求,不管它被转发/包含多少次、到哪个Servlet,过滤器都只会执行一次。
内容的提问来源于stack exchange,提问作者Rais Khabibulin
相关产品推荐
相关产品推荐

