我发送以下AJAX请求:
$.ajax({ type: 'POST',
data: $(this).parents('form:first').serialize(), url:'/myapp/comment/saveOrUpdate',
success: function(data,textStatus) {insertNewComment(data)},
error: function(xhr, textStatus, errorThrown) {alert(xhr.responseText);}
})
...我的控制器动作如下所示:
class CommentController {
...
def saveOrUpdate = {
...
if (error) {
response.sendError 419, 'You must wait at least 5 minutes before posting a new comment'
}
}}
不幸的是,我从来没有看到我在HTTP响应中发送的消息。相反,我得到了一个从Tomcat / Apache(或Grails?)生成的错误HTML页面,如下所示:
<html><head><title>Apache Tomcat/6.0-snapshot - Error report</title>
</head><body><h1>HTTP Status 419 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Status report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>Cannot find message associated with key http.419</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/6.0-snapshot</h3></body></html>
如何绕过生成的错误HTML页面,以便从JavaScript代码中检索消息“你必须等待......”?
感谢您的帮助。
答案 0 :(得分:0)
您正在设置HTTP状态错误,但实际上您正在捕获业务逻辑问题 - 应用程序错误。为什么不设置适当的应用程序级状态代码和消息(由您自己设计),并返回ajax响应中的那些(包括剩余时间)?如果您依赖于HTTP错误代码,则可能会在不同的浏览器中获得不同的结果,如果错误页面小于512字节,其中一些浏览器会劫持错误消息。
在您引用的情况下,Apache找不到与419匹配的已知错误消息。
您可以在.htaccess
配置中添加一个:
ErrorDocument 419 /errordocs/419.html
...然后让419.html页面说出你喜欢的任何内容(并确保页面超过512字节)。但我敢打赌,使用应用程序级状态代码正是您所需要的。