我正在开发一个支持 AJAX 的 JavaScript 前端,它可以调用用 Struts 编写的 Java 后端。我的问题是,当后端抛出异常时,客户端仍然会看到“200 OK”HTTP 响应代码,而不是像人们期望的那样“500 Internal Server Error”。

这让我反复陷入困境,因为我的第 3 方客户端 JavaScript 库依赖于 HTTP 状态代码来确定 AJAX 调用是否有问题,就像大多数现代库通常所做的那样。这些错误未被检测到,直到我的代码在尝试解析通常为 JSON 的内容时崩溃。

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

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

有帮助吗?

解决方案

我想出了一种方法来做到这一点。我不确定它是最好的还是最简单的,但它确实有效。我找到了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>

这会导致所有未处理的异常被重定向到 /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 指南中所建议的,我通过将以下内容添加到我的 <package>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" />

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

其他提示

更新:我修复了<global-results>部分(缺少httpheader标签)

我喜欢你的解决方案更好,但这是你可以做到的另一种方式,如果你不想弄乱w /在JSP中设置响应标题。

    在Struts.xml中,从“java.lang.exception”创建一个全局异常映射到名为“异常”的结果 struts.xml中的
  1. 创建一个全局结果,将“异常”映射到HttPheader的结果,其值为500。
  2. web.xml 中,创建一个错误 - 页面条目,将错误代码500映射到错误页面位置。
  3. so,for 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。但是,异常记录仍然可以工作(如果已启用它)。

    除了旁边,我也发现它令人困惑的是,这很困难。在我处理的每个其他框架中,我处理了返回错误页的概念错误代码非常微不足道。

500内部服务器错误是服务器端错误,这意味着问题可能不是您的计算机或Internet连接,而是网站服务器的问题。

注意到客户端在客户端处理。它位于配置在处理请求时的Web服务器(HTTP服务器)。

您没有提到您正在使用的js库。我建议仔细阅读文档。如果它有某种回调方法,它必须具有除世纪odiceTagcode以外的一些生成的。每当在服务器端发生一些验证异常时,也会传递错误消息。只是不要依赖于抛出一些例外,因为您正在使用Ajax。您可以跟踪该生成icOdeTagcode用于显示一些像“验证失败的消息一样,请重试”。同意?

否则抛出 whe webapplicationException 在响应之前致力于:

throw new javax.ws.rs.WebApplicationException();  // or by any other constructor
.

这里是 jar

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top