让 Struts 在抛出异常时发送 500 Internal Server Error
-
12-12-2019 - |
题
我正在开发一个支持 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中的
- 创建一个全局结果,将“异常”映射到HttPheader的结果,其值为500。
- 在 web.xml 中,创建一个错误 - 页面条目,将错误代码500映射到错误页面位置。
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