缺少X-Requested-With:XMLHttpRequest(导致200 OK但显示为错误?)

时间:2011-10-20 07:46:27

标签: jquery ajax jqgrid http-headers

当我从本地主机检索数据作为JSON时,一切正常。当我尝试从远程计算机获取JSON数据时,一切都还可以。我可以解析JSON数据来自我的localhost到对象(datagrid插件:jqgrid呈现它)。但是,当我尝试使用远程源时,它没有。在firebug它说200 OK,但它显示一个错误图标并将其写为红色。我检查了我的localhost和远程连接头之间的差异,我发现远程连接上没有那个头:

X-Requested-With    XMLHttpRequest

我认为问题可能就是这样。我没有设置它,它运作良好。它发生在远程请求。

有什么想法可以解决吗?

PS:我尝试设置Ajax标头但不起作用:

    $.ajaxSetup({
          headers: {"X-Requested-With":"XMLHttpRequest"}
    });

    $("#userTable").jqGrid({
        url:'http://xx.xx.x.xxx:8080/aa/bb/cc/user',
        colNames:['User Name','Password'],
        colModel:[
            {name:'userName',index:'userName', width:100},
            {name:'password',index:'password', width:55}
        ],
        jsonReader: ...
        ...
    });

当我使用该设置时,我甚至看不到来自Firebug的GET请求。

PS:我使用Spring 3和REST以及Tomcat作为Web服务器。

1 个答案:

答案 0 :(得分:1)

我认为您有Cross-site scripting问题。如果服务器在响应的HTTP标头中设置了一些additional options,则可以解决该问题。因此,解决方案不是像您当前那样修改客户端代码,而是在服务器代码中。

我建议您检查一下HTTP选项,这些选项将在the demo the answer中使用的tables.googlelabs.com中的HTTP标头中设置。您将看到服务器响应具有以下附加HTTP选项:

X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block

,JSON响应将放在jsonCallback参数定义的函数调用内。如果您使用jsonCallback=?,jqGrid将生成函数的名称(类似jQuery16407707202236448429_1319101394784)。您可以详细了解X-XSS-Protection选项hereX-Content-Type-Options: nosniff选项here

如何在the demo中看到,数据将显示在jqGrid中,因此可以在jqGrid中实现跨站点脚本。

因为我们调用服务器tables.googlelabs.com,它不支持jqGrid分页和排序参数,我在演示中使用

url: 'http://tables.googlelabs.com/api/query?jsonCallback=?',
postData: "sql=" + encodeURIComponent("SELECT * FROM 333136 LIMIT 10")

使用字符串而不是对象作为postData值将覆盖通常发布的任何其他jqGrid参数。在你的情况下,不需要这样做,可能你需要使用url: 'http://xx.xx.x.xxx:8080/aa/bb/cc/user?jsonCallback=?'

无论如何,您需要在服务器上实现JSONP的支持。这意味着服务器应该“理解”jsonCallback参数。实现取决于您的服务器端实现。在WCF服务的情况下,crossDomainScriptAccessEnabled="true"可能只是webHttpBinding绑定设置(请参阅here web.config的示例)。有关ASP.NET Web服务和ASP.NET MVC,请参阅this answerthis one(或this one)。

相关问题