doFilter() 是在 Servlet 的工作完成之前还是之后执行?

Posted

技术标签:

【中文标题】doFilter() 是在 Servlet 的工作完成之前还是之后执行?【英文标题】:Is doFilter() executed before or after the Servlet's work is done? 【发布时间】:2010-11-22 07:42:34 【问题描述】:

javax.servlet.Filter 对象既可以用于身份验证(过滤器需要在需要完成任何 servlet 工作之前捕获请求),也可以用于 XSLT 转换(其中 servlet 需要完全生成内容)。什么时候真正执行?

我知道这取决于实现(取决于 Web 容器),但这似乎是需要所有人解决的问题。

也许为每个过滤器注册到 Web 容器的某个地方设置了一个配置选项?

补充:

另外,什么决定了过滤器的执行顺序?为什么 FooFilter 会在 BarFilter 之前执行?

【问题讨论】:

@Rich: doFilter() 是在 Servlet 工作完成之前还是之后执行? > 过滤器是在服务器上运行的程序 > 在与其关联的 servlet 或 JSP 页面之前。 可以在 web.xml 文件中使用 提供过滤器执行的顺序。 Container 将使用自上而下提供的过滤器拦截程序的工作流。 【参考方案1】:

过滤器链本质上包装了 servlet 调用。链将处理所有链接,直到它到达“底部”,然后允许 servlet 运行,然后反向返回链。例如,如果您有一个新的“示例过滤器”,您的 doFilter() 方法可能如下所示:

public void doFilter(ServletRequest request,
      ServletResponse response, FilterChain chain) 
      throws IOException, ServletException 
// do pre-servlet work here
chain.doFilter(request, response);
// do post servlet work here


【讨论】:

这可能有点做作,但是如果我想拒绝响应呢?换句话说,我想阻止响应实际上出去?这是可以抛出 ServletException 的地方吗? 抛出 ServletException 仍会向客户端返回“响应”,因此这取决于您不返回响应的含义。您可以创建一个新的响应对象,仅包含您指定的内容,如果您愿意,则返回。 啊,好点。绝对没有回应是不可取的。即使 doFilter() 在调用 chain.doFilter() 之前返回,它仍然返回一些其他错误页面或默认值或其他。 @Jeremy RE:过滤器顺序:过滤器的应用顺序由它们在 web.xml 中的定义顺序定义 “逆向返回”有什么意义?【参考方案2】:

根据servlet2.3规范过滤是根据web.xml配置的filter-mapping sequence Ref-http://www.programering.com/a/MTMyADOwATI.html进行过滤

【讨论】:

虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。

以上是关于doFilter() 是在 Servlet 的工作完成之前还是之后执行?的主要内容,如果未能解决你的问题,请参考以下文章

Servlet过滤器重定向:如何在chain.doFilter(request,resp)之后重定向;

Servlet过滤器——异常捕获过滤器

AEM 中 doFilter servlet 的调度程序白名单

在 doFilter 中设置后获取 Cookie

Dubbo filter扩展

servlet基础