【问题标题】:How to get the message in a custom error page (Tomcat)?如何在自定义错误页面(Tomcat)中获取消息?
【发布时间】:2024-04-20 03:50:02
【问题描述】:

在 JSP 中,您可以使用 response.sendError(int code, String message) 返回特定的错误代码(例如,404 表示未找到)和消息。 只要您使用默认的丑陋 Tomcat 错误页面,这些消息就可以正常显示。但是,如果您创建自定义错误页面,您如何获得该消息? 我试过exception.getMessage()pageContext.getErrorData() 但无济于事。我一直在寻找这个几个小时,似乎没有人对同样的事情感到好奇! :S

我忘了提到到目前为止我只尝试过 404,因为那是我最需要的...由于某种原因异常为 null,因此尝试对其进行任何操作都会引发 NullPointerException。 错误页面是一个 404 错误页面,通过 web.xml 设置(因为我希望每个 404 错误都显示它),对于任何想知道的人来说,是的,它的 isErrorPage 指令设置为 true...

【问题讨论】:

  • 您的自定义 404 页面永远无法正常工作吗?你如何检查它是否有效?您是否检查过我下面提到的请求属性是否存在?最后一招试试这个教程playground.greyscale.se/wiki/en/Custom_404_page_in_Tomcat
  • 不,它工作正常。如果通过 response.sendError() 设置,我只是不知道如何获取消息。
  • response.sendError() 会将错误发送到您的客户端浏览器。之后它不会进入你的错误页面,除非你自己做。
  • 不,它显示自定义错误页面就好了,只要你通过 web.xml 正确设置它:) 唯一的事情是我不知道如何获取错误消息,如果设置。
  • 我发现了这个:*.com/questions/1104452/…

标签: jsp tomcat custom-error-pages


【解决方案1】:

错误信息可通过错误页面jsp中请求对象的javax.servlet.error.message属性获得。

这里是访问它的jsp语法:

<c:out value="${requestScope['javax.servlet.error.message']}"/>

您可以在新错误属性下的错误页面here 中查找其他与错误相关的信息。

【讨论】:

  • 它应该符合规范,并且在我们基于 Tomcat 的应用程序中确实如此。您可能有一些奇怪的配置问题。无论如何,祝你好运,最后知道解决方案会很高兴。
  • @Lea Verou:确实有效。可能您的应用程序中没有启用 jstl,因此 c:out 标记打印在 HTML 上,而您从未将其视为渲染输出。
【解决方案2】:

exception.getMessage() 应该可以工作

尝试添加exception.getClass().getName()

  1. 可能是没有消息的NullPointerException
  2. 或者异常不是来自 Sun 并且消息设置不正确

当然,如果我没记错的话,如果错误是由顶部带有 &lt;%@ page errorPage="/yourerrorpage.jsp" %&gt; 的 jsp 引发的,那么这当然有效。

如果错误来自 servlet,则异常详细信息作为请求属性传递

javax.servlet.error.status_code    java.lang.Integer
javax.servlet.error.exception_type java.lang.Class
javax.servlet.error.message        java.lang.String
javax.servlet.error.exception      java.lang.Throwable
javax.servlet.error.request_uri    java.lang.String
javax.servlet.error.servlet_name   java.lang.String

查看Servlet Specification(自~2011 年以来链接已断开)第 9.9 节

【讨论】:

  • 不要直接使用为请求属性提供的字符串,而是应该使用RequestDispatcher中定义的constants,例如RequestDispatcher.ERROR_EXCEPTION.
  • &lt;%@ page language="java" contentType="application/json; charset=UTF-8" pageEncoding="UTF-8" isErrorPage="true"%&gt;&lt;%out.println( request.getAttribute("javax.servlet.error.message") );%&gt;
【解决方案3】:

很抱歉这么晚才回答,但我在一周前遇到了这个问题,我浏览了很多不同的网站,但没有人真正按照我想听到的方式回答这个问题。在这篇文章中,我发现了一些有趣的解决方案,然后提出了自己的解决方案。只需在您的页面中包含此来源:

<%
    out.println(pageContext.getErrorData().getRequestURI());
    out.println("<br/>");
    out.println(pageContext.getErrorData().getStatusCode());
    out.println("<br/>");
    out.println(pageContext.getException());
    out.println("<br/>");
%>

它对我来说非常好。

【讨论】:

    【解决方案4】:

    ErrorDataexception 部分仅在错误页面是由于异常而不是响应错误代码而加载时才会设置。

    HttpServletResponse 上查看javadoc 以获取sendError。它提到了为什么您没有看到您传递给 sendError 的消息(强调我的):

    使用指定状态向客户端发送错误响应。服务器默认创建响应,使其看起来像包含指定消息的 HTML 格式的服务器错误页面,将内容类型设置为“text/html”,不修改 cookie 和其他标头。 如果已针对传入的状态码对应的 Web 应用程序进行了错误页面声明,则将优先于建议的 msg 参数返回它。

    如果响应已提交,则此方法将引发 IllegalStateException。使用此方法后,应认为响应已提交,不应写入。

    【讨论】:

    • 谢谢。我以前读过,但没有注意到你强调的部分。所以,长话短说,这根本不可能吗? :-(
    【解决方案5】:

    你想要的东西在我看来很奇怪:)。也就是说,我会执行以下操作:

    1. 实现HttpResponseWrapper,以这种方式包装任何其他HttpResponse

      public class HttpResponseWrapper implements HttpResponse {
          private String errorMessage;
      ...
      
          @Override
          public void sendError(...) {
              <save error message here>
          }
      ...
      }
      
    2. 创建一个过滤器并在其中包装任何响应

    3. 对所有请求进行过滤,并在链中排在首位

    4. 在您的错误页面中检查响应是否为 instanceof HttpResponseWrapper

    5. 获取您的信息

    【讨论】:

    • 感谢您的宝贵时间,但您真的阅读了我的帖子吗?我已将 isErrorPage 设置为 true,并且我的 404 工作正常(这意味着我已经在 web.xml 中正确完成了它,因此无需提及错误页面标记)。我还提到我的问题是关于 404,而不是例外。
    • 是的,我的错。不知何故错过了问题的重点。发生。更新我的答案
    【解决方案6】:

    你可以使用

    ${requestScope['javax.servlet.error.message']}
    

    如果页面上没有jstl

    【讨论】:

      最近更新 更多