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

30
javax.servlet.Filter对象可用于身份验证(其中Filter需要在任何servlet工作之前捕获请求)和XSLT翻译(其中servlet需要完全完成生成内容)。它实际上是在什么时候被执行的?
我知道这取决于实现(在Web容器上),但这似乎是所有Web容器都需要解决的问题。
也许有一个配置选项设置在每个Filter注册到Web容器时?
此外,是什么控制了Filter执行的顺序?为什么FooFilter会在BarFilter之前执行?

@Rich:doFilter()方法是在Servlet的工作完成前还是后执行的?> 过滤器是在与其关联的Servlet或JSP页面之前运行在服务器上的程序。 - KV Prajapati
filter-mapping 可以在 web.xml 文件中指定过滤器的执行顺序。容器会从上到下拦截程序的工作流程,并使用提供的过滤器进行处理。 - Todor Kolev
2个回答

66

过滤器链本质上包装了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的地方吗? - Jeremy Powell
1
抛出Servlet异常仍会向客户端返回一个“响应”,因此这取决于您所指的不返回响应的含义。如果您愿意,可以创建一个新的响应对象,其中只包含您指定的内容,并返回该对象。 - Rich Kroll
啊,说得好。绝对没有响应真的不是一个理想的选择。即使在 doFilter() 在调用 chain.doFilter() 之前返回,它仍会返回其他错误页面或默认页面等内容。 - Jeremy Powell
2
@Jeremy 关于过滤器顺序:过滤器的应用顺序由它们在web.xml中定义的顺序确定。 - Rich Kroll
“返回链的逆向”有什么意义? - Joe D

-2

虽然这理论上回答了问题,但最好在此处包含答案的基本部分,并提供参考链接。 - Rory McCrossan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接