小编典典

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

jsp

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

现在,我刚刚宣布了<error-page>web.xml这些类型的错误。它基本上将请求转发到预定义的JSP /
HTML错误页面,在该页面中,最终用户将收到严重错误通知,并且用户可以联系xx@xx.xx以获得进一步的帮助。同一页面还显示有关错误/异常的全局详细信息。

它可以在常规HTTP请求中完美运行,但是您如何使用jQuery在XMLHtttp请求中处理它呢?什么是最佳的用户体验?对我来说,它将只是显示整个错误页面,就好像它是普通的HTTP请求一样。我已经解决了如下问题:

function init() {
    $.ajaxSetup({
        error: handleXhrError
    });
}

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

尽管它可以完美运行,但在我看来,它就像一个黑客。将整个文档替换为HTTP错误页面的内容。但这也是您遵循的方式吗?如果不是,您能否详细说明为什么不这样做以及您希望采用哪种方式?我看到的唯一替代方法是使用JS显示一些警报/消息框,以通知用户有关无法解决的错误,但是用户
可以 将其关闭并继续浏览该页面,但这是不可能的。


阅读 172

收藏
2020-06-08

共1个答案

小编典典

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

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,类等)时,请不要忘记相应地更改子字符串索引。

2020-06-08