当抛出异常时,使Struts发送500内部服务器错误
我正在开发一个支持AJAX的JavaScript前端,用于调用使用Struts编写的Java后端。 我的问题是,当后端引发异常时,客户端仍然会看到一个“200 OK”HTTP响应代码,而不是像“500内部服务器错误”那样。
这反复让我反感,因为我的第三方客户端JavaScript库依赖于HTTP状态代码来确定AJAX调用是否有问题,正如大多数现代库通常所做的那样。 直到我的代码尝试解析通常为JSON的代码时,错误才被发现。
我真的想避免黑客我的客户端JS库,以妥善处理这些错误。 那么,当后端出现未处理的异常时,如何让Struts为我提供500个状态码? 这不应该是Struts的默认行为吗?
编辑:在这种情况下,客户端代码是无关紧要的。 我需要修复服务器,以便在未处理的异常发生时发送适当的状态码。 谢谢!
我想出了一个办法。 我不确定它是最好的还是最简单的,但它的工作原理。 我找到了Struts异常配置指南,并将以下内容添加到struts.xml
<package>
:
<global-results>
<result name="exception">/exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="exception" />
</global-exception-mappings>
这会导致所有未处理的异常重定向到/exception.jsp
。 这里是JSP的内容:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="application/json; charset=UTF-8" %>
<% response.setStatus(500); %>
{"success": false,"errors": "<s:property value="%{exception.message}"/>"}
您会在第三行注意到我手动将响应代码设置为500。
这给了我一个新问题:异常不再被记录。 正如在前面提到的Struts指南中所建议的那样,我通过在struts.xml
<package>
中添加以下内容来解决此问题:
<interceptors>
<interceptor-stack name="appDefaultStack">
<interceptor-ref name="defaultStack">
<param name="exception.logEnabled">true</param>
<param name="exception.logLevel">ERROR</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="appDefaultStack" />
Struts:-1用于制作这样一个简单而明显的功能,而不是默认功能,另外一个用于使解决方案如此钝。
更新 :我修复了<global-results>
部分(缺少httpheader标签)
我更喜欢你的解决方案,但是如果你不想在jsp中设置响应头文件,那么这里有另一种方法可以实现它。
所以,对于struts.xml:
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="exception" />
</global-exception-mappings>
<global-results>
<result name="exception" type="httpheader">
<param name="error">500</param>
</result>
</global-results>
对于web.xml
<error-page>
<error-code>500</error-code>
<location>/exception.jsp</location>
</error-page>
这有效,但有一些很大的缺点。 servlet容器正在呈现错误页面(不是struts),因此您无法访问原始错误消息或struts valueStack。 异常日志记录仍然有效,但是(如果你已经启用它)。
顺便说一句,我也觉得struts使得这很困难。 在所有其他框架中,我已经处理了返回错误页面的概念, 并且错误代码实现起来相当微不足道。
500内部服务器错误是服务器端错误,这意味着问题可能不在于您的计算机或Internet连接,而是网站服务器的问题。
有意在客户端处理这个问题。 它位于Web服务器(HTTP服务器)上,用于处理请求。
链接地址: http://www.djcxy.com/p/58215.html上一篇: Making Struts send 500 Internal Server Error when exceptions get thrown