在抛出异常时使Struts发送500内部服务器错误

cur*_*sdf 8 struts http-response-codes

我正在开发一个支持AJAX的JavaScript前端,它调用使用Struts编写的Java后端.我的问题是,当后端抛出异常时,客户端仍然会看到"200 OK"HTTP响应代码,而不是像预期的那样"500内部服务器错误".

这让我反复绊倒,因为我的第三方客户端JavaScript库依赖于HTTP状态代码来确定AJAX调用是否有问题,正如大多数现代库通常所做的那样.错误传递未检测到,直到我的代码在尝试解析通常为JSON的东西时爆炸.

我真的想避免黑客攻击我的客户端JS库,以便优雅地处理这些错误.那么,当后端出现未处理的异常时,如何让Struts为我提供500状态代码呢?这不应该是Struts的默认行为吗?

编辑:在这种情况下,客户端代码无关紧要.我需要修复服务器,以便在未处理的异常发生时发送相应的状态代码.谢谢!

cur*_*sdf 3

我想出了一种方法来做到这一点。我不确定它是最好的还是最简单的,但它确实有效。我找到了 Struts异常配置指南,并将以下内容添加到我的<package>里面struts.xml

<global-results>
  <result name="exception">/exception.jsp</result>
</global-results>

<global-exception-mappings>
  <exception-mapping exception="java.lang.Exception" result="exception" />
</global-exception-mappings>
Run Code Online (Sandbox Code Playgroud)

这会导致所有未处理的异常被重定向到/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}"/>"}
Run Code Online (Sandbox Code Playgroud)

您会在第三行注意到我手动将响应代码设置为 500。

这给我带来了一个新问题:不再记录异常。正如前面提到的 Struts 指南中所建议的,我也通过将以下内容添加到我的<package>in 中struts.xml来解决这个问题:

<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" />
Run Code Online (Sandbox Code Playgroud)

Struts:-1 表示这样一个简单而明显的功能不是默认功能,另一个 -1 表示使解决方案如此迟钝。