如何在Tomcat错误页面中访问HTTP响应文本

3

我正在使用Tomcat 6(但是对于Tomcat 7也应该适用)。假设我的web.xml包含以下定义:

<error-page>
    <error-code>401</error-code>
    <location>/Handle401Error.jsp</location>
</error-page>

假设我现在从某个其他的Servlet/JSP返回HTTP 401:
httpResponse.sendError(SC_UNAUTHORIZED, "This is a message");

我如何在Handle401Error.jsp中访问HTTP响应文本(“This is a message”)?Tomcat的做法是,在显示类似于此错误页面时,使用ValveErrorReportValve)。我也需要编写一个Valve吗?
编辑:下面的被接受答案正是我一直在寻找的,而假定的重复问题并没有提到相同的解决方案。

当运行时异常被抛出时,如何在浏览器中显示用户友好的错误页面 - André Schild
不,这与异常无关。我知道如何以这种方式处理异常。 - vektor
如果您建议抛出异常而不是返回HTTP代码+消息,是的,这听起来可行,如果没有直接的方法可以做到这一点,我可能会考虑它。但这仍然是一个hack。 - vektor
@kevcodez 是的,它似乎是一个重复的问题。我会调查另一个问题,谢谢。 - vektor
1个回答

1

Tomcat将消息字符串存储在内部类org.apache.coyote.Response中。

没有标准的访问消息的方式:根据HttpServletResponse#sendError(int,String)的javadoc:

如果为传递的状态代码对应的Web应用程序进行了错误页面声明,则它将优先返回,而不是建议的msg参数,并且将忽略msg参数

API设计不佳。

作为解决方法,您可以将错误消息作为属性放入请求中,只需调用response.sendError(401),并从错误页面中提取请求属性中的消息:

在您的代码中:

HttpServletRequest request = ...
HttpServletResponse response = ...
request.setAttribute("myerrormessage", "This is a message");
response.sendError(401);

在您的错误jsp页面中:
Message <%=request.getAttribute("myerrormessage")%>    

请问您能详细说明如何向响应中添加属性吗? - vektor
我的错误,ServletResponse 中没有属性,只有在 ServletRequest 中(已相应地编辑了我的答案)。 - wero
非常感谢,这个很好用。我打算接受你的答案,但是为了让你将来获得更多的赞 - 你介意写一些示例代码片段吗? :) - vektor

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