缺少 X-Requested-With:XMLHttpRequest(导致 200 OK 但显示为错误?)
当我从本地主机检索 JSON 数据时,一切正常。当我尝试从远程计算机获取 JSON 数据时,一切都正常。我可以将来自本地主机的 JSON 数据解析为对象(数据网格插件:jqgrid 渲染它)。但是,当我尝试使用远程源时却没有。在 firebug 中,它显示 200 OK,但显示错误图标并将其写为红色。我检查了本地主机和远程连接标头之间的差异,发现远程连接处没有该标头:
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:我使用带有 REST 的 Spring 3 和 Tomcat 作为 Web 服务器。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为您遇到了跨站点脚本问题。如果服务器在 HTTP 标头中设置一些附加选项,问题就可以解决的响应。所以解决方案不是像现在那样修改客户端代码,而是在服务器代码中。
我建议您检查将在 来自 href="https://stackoverflow.com/questions/4317646/jqgrid-returns-blank-cells/4326986#4326986">答案。您将看到服务器响应具有以下附加 HTTP 选项:
并且 JSON 响应将放置在由
jsonCallback
参数定义的函数调用内。如果您使用jsonCallback=?
jqGrid 将生成函数的名称(类似于jQuery16407707202236448429_1319101394784
)。您可以阅读有关X-XSS-Protection
选项的更多信息 此处 以及关于X-Content-Type-Options: nosniff
选项 此处。您可以在演示中看到,数据将是显示在jqGrid中,因此可以在jqGrid中实现跨站脚本。
因为我们调用的服务器是
tables.googlelabs.com
,不支持jqGrid分页和排序参数,所以我在demo中使用了string而不是object作为
postData
值将覆盖通常发布的任何其他 jqGrid 参数。在您的情况下,不需要这样做,可能您只需要使用url: 'http://xx.xx.x.xxx:8080/aa/bb/cc/user?jsonCallback=?'< /代码>。
无论如何,您需要在服务器上实现 JSONP 支持。这意味着服务器应该“理解” jsonCallback 参数。实现取决于您的服务器端实现。对于 WCF 服务,它可能只是
webHttpBinding
的crossDomainScriptAccessEnabled="true"
绑定设置(请参阅 这里是一个示例web.config
)。请参阅此答案和这个一个(或这个一) 另外用于 ASP.NET Web 服务和 ASP.NET MVC。I think that you have the Cross-site scripting issue. The problem can be solved if the server set some additional options in the HTTP header of the response. So the solution is not in the modifying of the client code like you do currently, but in the server code.
I recommend you examine the HTTP options which will be set in the HTTP header by
tables.googlelabs.com
used in the demo from the answer. You will see that the server response has the following additional HTTP options:and the JSON response will be placed inside of the call of the function defined by
jsonCallback
parameter. If you would usejsonCallback=?
jqGrid will generate the name of the function (something likejQuery16407707202236448429_1319101394784
). You can read more aboutX-XSS-Protection
option here and aboutX-Content-Type-Options: nosniff
option here.How you can see in the demo, the data will be displayed in the jqGrid, so the Cross-site scripting can be implemented in the jqGrid.
Because we call the server
tables.googlelabs.com
, which not support jqGrid paging and sorting parameters, I used in the demoThe usage of string instead of object as the
postData
value will overwrite any other jqGrid parameters which are typically posted. In you case it will be not needed to do this and probably you need just useurl: 'http://xx.xx.x.xxx:8080/aa/bb/cc/user?jsonCallback=?'
.In any way you need implement support of JSONP on your server. It means just that the server should "understand"
jsonCallback
parameter. The implementation depends on your server side implementation. It could be justcrossDomainScriptAccessEnabled="true"
binding setting for thewebHttpBinding
in case of WCF service (see here an example of theweb.config
). See this answer and this one (or this one) additionally for ASP.NET Web services and ASP.NET MVC.