直截了当:您将如何处理jQuery ajax请求中的服务器端HTTP 4nn / 5nn错误?这种情况涉及服务器端的JSP / Servlet Web应用程序。在这里,我不是在谈论诸如此类的琐碎的运行时异常NullPointerException。假设它们都处理得很好。此类HTTP 4nn / 5nn错误的一个很好的例子是401未经授权(用户权限不足)和500内部服务器错误(数据库关闭,I / O错误,Errors等)。假设它们不能(或不应该)在编码级别被捕获。
NullPointerException
Error
现在,我刚刚宣布了<error-page>在web.xml这些类型的错误。它基本上将请求转发到预定义的JSP / HTML错误页面,在该页面中,最终用户将收到严重错误通知,并且用户可以联系xx@xx.xx以获得进一步的帮助。同一页面还显示有关错误/异常的全局详细信息。
<error-page>
web.xml
它可以在常规HTTP请求中完美运行,但是您如何使用jQuery在XMLHtttp请求中处理它呢?什么是最佳的用户体验?对我来说,它将只是显示整个错误页面,就好像它是普通的HTTP请求一样。我已经解决了如下问题:
function init() { $.ajaxSetup({ error: handleXhrError }); } function handleXhrError(xhr) { document.open(); document.write(xhr.responseText); document.close(); }
尽管它可以完美运行,但在我看来,它就像一个黑客。将整个文档替换为HTTP错误页面的内容。但这也是您遵循的方式吗?如果不是,您能否详细说明为什么不这样做以及您希望采用哪种方式?我看到的唯一替代方法是使用JS显示一些警报/消息框,以通知用户有关无法解决的错误,但是用户 可以 将其关闭并继续浏览该页面,但这是不可能的。
毕竟,对于异步请求,以与同步请求相同的方式处理错误是最佳的用户体验。只有
function handleXhrError(xhr) { document.open(); document.write(xhr.responseText); document.close(); }
当您也<script>需要加载和初始化元素时,它将在IE6 / 7/8中失败。IE6 / 7/8不会那样做。为了使IE能够做到这一点,您基本上需要保留当前<head>元素,并仅用替换其子元素$("head").html(newHead)。应该对该<body>元素执行相同的操作。
<script>
<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,类等)时,请不要忘记相应地更改子字符串索引。
$(xhr.responseText)