今天浏览oschina.net的《网站出bug了??还是被人黑了啊??》发现的这个问题,发表评论采用了Ajax技术,但是直接提交Ajax没有起作用,导致返回了原本由JavaScript处理的JSON结果,出现这种情况多数是因为页面JavaScript加载失败或者用户禁用了脚本所致,回想到我以前的设计,有个小技巧可以解决这个问题,现与大家分享下:
基本思路就是在Ajax提交前加入自定义的HTTP请求header,然后结果处理页判断是否有这个header,如果有就说明对方是通过Ajax提交的数据,显示JSON结果;如果没有则说明Ajax没有起作用,然后就直接输出用户友好的标准结果页。
基本上JavaScript可以通过setRequestHeader
设置请求头,比如我们设置一个值为1的自定义头信息为X-AJAX-CLIENT
:
setRequestHeader("X-AJAX-CLIENT","1"); |
然后在程序后台可以使用类似下面的代码来判断(PHP示例):
<?php if ($_SERVER['HTTP_X_AJAX_CLIENT'] == '1'){ echo '{success:1}'; # JSON format } else { ?> <!DOCTYPE html> <html> <head> <title>提交成功</title> </head> <body> <p>评论发布成功!</p> </body> </html> <?php } |
很有深度的博客,学习了。谢谢大神的知识分享
不客气,欢迎常来:-)
jQuery的Ajax请求是有这个字段的。
很多php框架也加入了类似 IsAjax的判断。
public function is_ajax_request()
{
return ($this->server(‘HTTP_X_REQUESTED_WITH’) === ‘XMLHttpRequest’);
}
ASP中有时候这个字段不会初始化到Request.ServerVariables里面,所以我一般用下面的方式判断:
Function IsAjax()
If InStr(Request.ServerVariables(“ALL_HTTP”),”HTTP_X_REQUESTED_WITH”)>0 Then
IsAjax=True
Else
IsAjax=False
End If
End Function
写完这篇文章后才发现原来已经有
X-REQUESTED-WITH
这个Header来进行判断了,不过我觉得ASP中保险起见除了要判断ALL_HTTP
中是否有HTTP_X_REQUESTED_WITH
这个头还应该判断内容是否是XMLHttpRequest
就像你说的PHP版一样,ASP可以试试下面的代码:不错。学习了