当我从本地主机检索数据作为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服务器。
答案 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
选项here和X-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 answer和this one(或this one)。