切中要害:如何处理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请求一样。我已经解决了如下问题:
function init() {
$.ajaxSetup({
error: handleXhrError
});
}
function handleXhrError(xhr) {
document.open();
document.write(xhr.responseText);
document.close();
}
尽管它工作得很完美,但在我看来,它就像一个黑客。将整个文档替换为HTTP错误页的内容。但这也是你要遵循的方式吗?如果没有,你能详细说明为什么不和你更喜欢什么方式吗?我看到的唯一替代方法是使用JS显示一些警告/消息框来通知用户无法解决的错误,但是用户可以忽略它并继续页面,而这应该是不可能的。
发布于 2013-03-28 20:44:14
毕竟,以与同步请求相同的方式处理异步请求上的错误是最好的用户体验。只是,
function handleXhrError(xhr) {
document.open();
document.write(xhr.responseText);
document.close();
}
当你有需要加载和初始化的<script>
元素时,在IE6/7/8中将会失败。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。当您在错误页面模板的<body>
上有一些属性(例如ID、类等)时,不要忘记相应地修改子字符串索引。
发布于 2009-11-16 05:33:25
使用JQuery对话框,如下所示:
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
发布于 2009-11-16 06:42:26
如有必要,您还应该能够重定向到使用window.location.href = "url-to-error-page";
设置的某个预定义错误页面
https://stackoverflow.com/questions/1738785
复制相似问题