2012-03-12 102 views
7

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

这反复让我反感,因为我的第三方客户端JavaScript库依赖于HTTP状态代码来确定AJAX调用是否有问题,正如大多数现代库通常所做的那样。直到我的代码尝试解析通常为JSON的代码时,错误才被发现。

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

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

回答

3

我想通了,这样做的一种方式。我不确定它是最好的还是最简单的,但它的工作原理。我发现了Struts Exception Configuration guide并添加以下到我的<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。

这给了我一个新的问题,3号线:异常不记录任何更多。由于上述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制造这种简单而明显的特征不是默认,另有-1让解决方案变得如此呆板。

-1

你没有提到你正在使用哪个JS库。我建议仔细阅读文档。如果它有某种回调方法,则必须有responseText以外的responseCode。每当服务器端发生一些验证异常时,也要传递错误消息。只是不要抛出一些例外,因为你使用的是AJAX。你可以跟踪responseText显示一些消息,如“验证因此失败,请再试一次”。同意?

否则抛出WebApplicationException响应被提交之前:

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

这里是jar

+0

客户端库是ExtJS,但没关系。服务器是什么问题。当服务器端出现未处理的异常时,Struts会发送一个HTML错误报告和一个“200 OK”状态码,这就是我想要解决的问题。我可以处理的HTML,但Struts必须能够在错误发生时发送代码500,而不是代码200.谢谢! – curtisdf 2012-03-14 18:56:52

+0

'WebApplicationException()'导致HTTP 500错误代码。你试过扔这个吗? – tusar 2012-03-14 19:03:37

+0

在服务器端,我想避免在任何地方插入try/catch块。我只需要一些可以告诉Struts的配置,“做正确的事(tm),并且在发送这些愚蠢的问题报告时给我一个500响应代码。” – curtisdf 2012-03-14 19:04:59

0

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

有意在客户端处理此问题。它位于Web服务器(HTTP服务器)上,用于处理请求。

+0

-1。我认为,按照我写下我的问题的方式,很明显,我已经了解了500内部服务器错误以及客户端 - 服务器交互的性质。我正在寻找关于如何使Struts(在我的服务器上)按照我希望的方式行事的信息。 – curtisdf 2012-12-18 16:55:27

2

更新:我已经解决了<global-results>部分(这是缺少的HTTPHeader标签)

我喜欢your solution更好,但这里的另一种方式,你可以做,如果你W¯¯不想乱/在jsp中设置响应头。

  1. 在struts.xml中,创建“java.lang.Exception的”全球异常映射到一个名为“异常”
  2. 在struts.xml的结果,建立一个全球性的结果是“异常”映射到httpheader结果的值为500.
  3. 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使这个如此困难。在所有其他框架中,我已经处理了返回错误页面的概念,但错误代码实现起来相当微不足道。

相关问题