是否可以保证不调用ServletRequestListener.requestDestroyed?

时间:2019-12-23 06:50:28

标签: java tomcat servlet-listeners

调试运行在Tomcat 7.0.59上的Web应用程序时,我注意到请求侦听器requestDestroyed()中的日志消息未打印。

    public class RequestListener implements ServletRequestListener {
        .
        . 
        .

        @Override
        public void requestInitialized(ServletRequestEvent sre) {
            log.debug("Init Request for thread " + System.identityHashCode(Thread.currentThread()));
        }

        @Override
        public void requestDestroyed(ServletRequestEvent sre) {
            log.debug("Destroying Request for thread " + System.identityHashCode(Thread.currentThread()));
        }
    }

但是,requestInitialized()中的消息确实出现了。进一步研究,我注意到处理请求的servlet称为 response.sendError(HttpServletResponse.SC_NOT_MODIFIED)

将其更改为response.setStatus(HttpServletResponse.SC_NOT_MODIFIED)后,正在调用requestDestroyed并且正在打印消息。通过查看Tomcat类StandardHostValve,我看到了为什么以前没有调用它:

    if (!request.isAsync() && !response.isErrorReportRequired()) {
        context.fireRequestDestroyEvent(request);
    }

调用sendError()时,isErrorReportRequired返回true

我找不到任何文档说明为什么有条件地调用fireRequestDestroyEvent()的原因。到达这一点时,它是否指示请求生命周期的结束,而不管是否存在错误?

我想我可以使用过滤器来完成requestDestroyed()中正在执行的操作,但是想让监听器实现其目的:)

感谢您的时间!

0 个答案:

没有答案