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 文件中使用过滤器链本质上包装了 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)之后重定向;