首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在jQuery的ajax请求中处理返回整个HTML文档的服务器端HTTP 4nn/5nn错误

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

Stack Overflow用户
提问于 2009-11-16 04:53:03
回答 4查看 4.2K关注 0票数 20

切中要害:如何处理jQuery的ajax请求中的服务器端HTTP 4nn/5nn错误?本例涉及服务器端的JSP/Servlet the应用程序。在这里,我不是在谈论诸如NullPointerException等微不足道的运行时异常。假设它们都得到了完美的处理。这种HTTP4NN/5NN错误的一个很好的例子是401未授权(用户权限不足)和500内部服务器错误(数据库关闭、I/O错误、Error等)。假设它们不能(或不应该)在编码级别被捕获。

现在,我刚刚在web.xml中为这类错误声明了一个<error-page>。它基本上将请求转发到一个预定义的JSP错误页面,在这个页面中,终端用户被告知发生了一个严重的错误,用户可以联系xx@xx.xx寻求进一步的帮助。同一页面还显示有关错误/异常的全局详细信息。

它在常规的超文本传输协议请求中工作得很好,但是如何在使用jQuery的XMLHtttp请求中处理它呢?对用户体验最好的是什么?对我来说,它只是显示整个错误页面,就好像它是一个普通的HTTP请求一样。我已经解决了如下问题:

代码语言:javascript
复制
function init() {
    $.ajaxSetup({
        error: handleXhrError
    });
}

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

尽管它工作得很完美,但在我看来,它就像一个黑客。将整个文档替换为HTTP错误页的内容。但这也是你要遵循的方式吗?如果没有,你能详细说明为什么不和你更喜欢什么方式吗?我看到的唯一替代方法是使用JS显示一些警告/消息框来通知用户无法解决的错误,但是用户可以忽略它并继续页面,而这应该是不可能的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-28 20:44:14

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

代码语言:javascript
复制
function handleXhrError(xhr) {
    document.open();
    document.write(xhr.responseText);
    document.close();
}

当你有需要加载和初始化的<script>元素时,在IE6/7/8中将会失败。IE6/7/8不会这样做。为了让IE做到这一点,你基本上需要保留当前的<head>元素,并且只用$("head").html(newHead)替换它的子元素。应该对<body>元素执行同样的操作。

代码语言:javascript
复制
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。当您在错误页面模板的<body>上有一些属性(例如ID、类等)时,不要忘记相应地修改子字符串索引。

票数 5
EN

Stack Overflow用户

发布于 2009-11-16 05:33:25

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

代码语言:javascript
复制
function handleXhrError(xhr) {
   ele = $("<div></div>").appendTo("body");
   ele.html(xhr.responseText);
   $(ele).dialog();

}

我应该回答你剩下的问题。我会在可能的情况下抛出并捕获特定的异常,并向客户端发送特殊消息。有时,我会指示客户端运行一个函数,该函数可能会重定向浏览器或部分刷新页面。这只取决于具体情况。捕获400/500将处理真正的错误,但是您还希望编写一次JS代码来过滤所有AJAX请求,以获得将从服务器返回的自定义错误标志,请查看此页面以获取更多信息:http://www.bennadel.com/blog/1392-Handling-AJAX-Errors-With-jQuery.htm

票数 3
EN

Stack Overflow用户

发布于 2009-11-16 06:42:26

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1738785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档