代码之家  ›  专栏  ›  技术社区  ›  BalusC

处理服务器端HTTP 4nn/5nn错误,在jQuery的ajax请求中返回整个HTML文档

  •  19
  • BalusC  · 技术社区  · 16 年前

    要点:您将如何处理jQuery的ajax请求中的服务器端HTTP4NN/5nn错误?本例涉及服务器端的JSP/Servlet Web应用程序。在这里,我并不是在谈论一些琐碎的运行时异常,比如 NullPointerException 等等假设他们都处理得很好。HTTP 4nn/5nn错误的一个很好的例子是401未经授权(用户权限不足)和500内部服务器错误(数据库关闭、I/O错误、, Error s、 等等)。假设它们不能(或不应该)在编码级别被捕获。

    现在我刚刚宣布 <error-page> 在里面 web.xml 对于那些错误。它基本上会将请求转发到预定义的JSP/HTML错误页面,在该页面中,终端用户会被告知发生了严重错误,用户可以与之联系xx@xx.xx寻求进一步援助。该页面还显示有关错误/异常的全局详细信息。

    function init() {
        $.ajaxSetup({
            error: handleXhrError
        });
    }
    
    function handleXhrError(xhr) {
        document.open();
        document.write(xhr.responseText);
        document.close();
    }
    

    虽然它工作得很好,但我觉得它像一个黑客。用HTTP错误页的内容替换整个文档。但这也是你要遵循的方式吗?如果没有,你能详细说明为什么不,以及你喜欢什么方式吗?我看到的唯一替代方法是使用JS显示一些警报/消息框来通知用户无法解决的错误,但是 在不可能的情况下,关闭它并继续页面。

    5 回复  |  直到 13 年前
        1
  •  5
  •   BalusC    13 年前

    毕竟,以与同步请求相同的方式处理异步请求上的错误最有利于用户体验。只是

    function handleXhrError(xhr) {
        document.open();
        document.write(xhr.responseText);
        document.close();
    }
    

    <script> 也需要加载和初始化的元素。IE6/7/8不会这么做。为了让IE做到这一点,你基本上需要保持当前状态 <head> 元素,并仅将其子元素替换为 $("head").html(newHead) . 同样的做法也应适用于其他国家 <body>

    function handleXhrError(xhr) {
        var newDocument = xhr.responseText;
        $("head").html(newDocument.substring(newDocument.indexOf("<head>") + 6, newDocument.indexOf("</head>")));
        $("body").html(newDocument.substring(newDocument.indexOf("<body>") + 6, newDocument.indexOf("</body>")));
    }
    

    很恶心,但不可能做一个 $(xhr.responseText) 当响应文本表示带有头部和正文的整个HTML文档时。在启用某些属性时,不要忘记相应地更改子字符串索引 < 错误页面模板的名称(例如ID、类等)。

        2
  •  3
  •   Josh Pearce    16 年前

    使用JQuery对话框,如下所示:

    function handleXhrError(xhr) {
       ele = $("<div></div>").appendTo("body");
       ele.html(xhr.responseText);
       $(ele).dialog();
    

    http://www.bennadel.com/blog/1392-Handling-AJAX-Errors-With-jQuery.htm

        3
  •  2
  •   dan_nl    16 年前

    如有必要,您还应该能够重新指向您设置的其中一个预定义错误页面 window.location.href = "url-to-error-page";

        4
  •  1
  •   Peter Stuifzand    16 年前

        5
  •  1
  •   J5.    16 年前

    您似乎希望在收到可能导致无法使用状态的错误条件后保留工作页面/应用程序。

    这背后的理论与交易有关。通常,执行流程为:

      1. 捕获状态
      2. 将控制返回到调用代码
    1. 错误:指示事务管理器回滚事务
      1. 丢弃不再需要的任何数据(例如,状态序列化)
      1. 根据需要完成事务中的操作
      2. 丢弃不再需要的任何数据

    我还没有认真研究javascript中的事务管理。由于您声明服务器端错误导致客户端不可用,因此可能有某种方法在服务器端实现事务的一部分。重要的是,你不要把事情做了一半,而不是留在客户端。

    您是否考虑过在客户端应用程序尝试执行真正的工作之前,执行“飞行前检查”请求以尝试捕获这些问题?

    推荐文章