解决客户端AJAX脚本失效或禁用导致显示JSON的问题

!本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使用方面,本人不保证相应的兼容和可操作性。

今天浏览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
}
若无特别说明,本网站文章均为原创,原则上这些文章不允许转载,但是如果阁下是出于研究学习目的可以转载到阁下的个人博客或者主页,转载遵循创作共同性“署名-非商业性使用-相同方式共享”原则,请转载时注明作者出处谢绝商业性、非署名、采集站、垃圾站或者纯粹为了流量的转载。谢谢合作!

  1. 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可以试试下面的代码:

      Function get_request_header(name)
          get_request_header = Request.ServerVariables("HTTP_" & UCase(Replace(name, "-", "_")))
      End Function
       
      IsAjax = CBool(UCase(get_request_header("X-REQUESTED-WITH")) = "XMLHTTPREQUEST")
请稍后...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*