3

我在 web.xml 中定义了一个错误页面:

 <error-page>
   <exception-type>java.lang.Exception</exception-type>
   <location>/error.jsp</location>
 </error-page>

在那个错误页面中,我创建了一个自定义标签。这个标签的标签处理程序通过电子邮件向我发送任何错误发生的堆栈跟踪。在大多数情况下,这很有效。

如果在错误发生时输出已经开始发送到客户端,则它不起作用的地方。在这种情况下,我们得到这个:

SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/error.jsp]
 java.lang.IllegalStateException

我相信会发生此错误,因为在输出已经开始后我们无法将请求重定向到错误页面。我使用的解决方法是增加特别大的 JSP 页面上的缓冲区大小。但是我正在尝试编写一个可以应用于现有应用程序的通用错误处理程序,并且我不确定通过数百个 JSP 页面确保它们的缓冲区足够大是否可行。

有没有办法在这种情况下仍然允许我的堆栈跟踪电子邮件代码执行,即使我实际上不能向客户端显示错误页面?

4

3 回答 3

2

如果您已经开始向客户端发送数据,则不会使用 errorPage。我所做的是使用 JavaScript 回调来检查不完整的页面,然后重定向到错误页面。在页面的开头包含标题或其他内容,将布尔 javascript 变量初始化为 false,并注册一个 onload 处理程序以检查状态并重定向到错误页面。

<script type="text/javascript">
        var pageLoadSuccessful = false;//set to true in footer.jsp
        dojo.addOnLoad(function(){
            if (!pageLoadSuccessful) window.location = "<c:url value="/error.do" />";
        });
</script>

然后在页脚 jsp 中,确保将此变量设置为 true:

<script type="text/javascript">
    pageLoadSuccessful = true;//declared in header.jsp
</script>
于 2009-12-02T16:13:52.787 回答
1

您是否尝试过使用 <%@ page errorPage="/myerrorpage.jsp" %> 指令?

然后,您还需要在 myerrorpage.jsp 中使用 <% page isErrorPage="true" $>。

我认为这可能会解决您的问题。唯一的问题是您需要以某种方式将它包含在每个 JSP 中。

于 2008-10-16T23:44:09.277 回答
1

事实上,这个特殊问题表明您在 JSP 中使用了 scriptlet。这是一种不好的做法,这个特殊的问题是造成这种情况的主要原因之一。您需要将所有业务逻辑移动到一个真正的java 类中,以便最终在 JSP 中只使用 taglibs/EL。在 servlet/filter 中,您可以在将请求转发到 JSP 之前完美地处理异常。

于 2009-12-02T16:17:46.057 回答