cur*_*sdf 8 struts http-response-codes
我正在开发一个支持AJAX的JavaScript前端,它调用使用Struts编写的Java后端.我的问题是,当后端抛出异常时,客户端仍然会看到"200 OK"HTTP响应代码,而不是像预期的那样"500内部服务器错误".
这让我反复绊倒,因为我的第三方客户端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>
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 表示使解决方案如此迟钝。
| 归档时间: |
|
| 查看次数: |
11505 次 |
| 最近记录: |