当抛出异常时,使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中,创建一个从“java.lang.Exception”到一个名为“exception”的结果的全局异常映射
  • 在struts.xml中,创建一个全局结果,将“异常”映射到值为500的httpheader结果。
  • 在web.xml中,创建一个将错误代码500映射到错误页面位置的错误页面条目。
  • 所以,对于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

    下一篇: Two sql for Sorted timestamp date