3

我的应用程序的 HTML5、jQuery Mobile 前端与 Java 服务器(Spring、Hibernate、MySQL)对话。该应用程序在我的笔记本以及 QA 环境中运行良好。在 QA 上,我使用服务器的 IP 地址访问应用程序。当我在 Live 环境中托管应用程序(与 QA 相同的服务器,但在 Tomcat 中使用不同的 Web 应用程序)并尝试使用带有域名的 URL 访问它时,应用程序中的 $.ajax 调用返回错误。

其中一个调用如下:

$.ajax({
   type : "GET",
   url : "http://www.smartcloudlearning.mobi:9080/SmartCloudLearningMobi/rest/resource/getResourceTypes",
   cache : false,
   async : false,
   dataType : 'json',
   success : function(rTypes) {
       Alert("success!");
   },
   error : function(XMLHttpRequest, textStatus, errorThrown) {
      alert("An error has occurred making the request: " + errorThrown);
   }
});

我在 Firefox 中收到以下错误:

An error has occurred making the request: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE)"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: http://www.smartcloudlearning.mobi/js/jquery-1.7.1.min.js :: <TOP_LEVEL> :: line 4"  data: no]

我在 Chrome 中收到以下错误:

An error has occurred making the request: Error: NETWORK_ERR: XMLHttpRequest: Exception 101

在服务器日志中,我看到请求的 Spring 服务已成功调用,但客户端似乎没有收到数据!

如果我点击网址

http://www.smartcloudlearning.mobi:9080/SmartCloudLearningMobi/rest/resource/getResourceTypes

直接在浏览器中,我得到了预期的结果!我觉得这在某种程度上是由于我如何将服务器请求从 Apache 转发到 Tomcat。

以下是 Apache / httpd 服务器的 httpd.conf 文件中的行:

ProxyPass /SmartCloudLearningMobi http://www.smartcloudlearning.mobi:9080/SmartCloudLearningMobi
ProxyPassReverse /SmartCloudLearningMobi http://www.smartcloudlearning.mobi:9080/SmartCloudLearningMobi

谁能告诉我这里有什么问题?非常感激!

我设法解决了这个问题:

浏览器在 .ajax 调用时出现错误,因为我的 URL 中有端口号。当我从我的 QA URL 创建“实时” URL 时,端口号被转移。当我从 .ajax 调用的 URL 中删除端口号时,调用开始返回成功!

Jason Foglia,你的陈述“......还有港口......”促使我探索那个角度......非常感谢!

4

3 回答 3

4

由于称为“同源策略”的安全概念不允许您从不同域调用服务,您可能会遇到错误。或者至少,不允许您调用该服务中的方法。

在这里找到相同的讨论 - AJAX Cross Domain

但是,您可以使用 JSONP 实现跨域 - JSONP上的维基百科

解决方案是将数据类型更改为 JSONP:

$.ajax({
   url:"http://www.smartcloudlearning.mobi:9080/SmartCloudLearningMobi...",
   dataType: 'jsonp',
   ...
});
于 2012-04-16T21:45:38.977 回答
2

尝试使用相对 url:如果这不起作用,则域名与 url 和端口相同。浏览器不允许跨域。

$.ajax({
   type : "GET",
   url : "/SmartCloudLearningMobi/rest/resource/getResourceTypes",
   cache : false,
   async : false,
   contentType : "application/json"
   dataType : 'json',
   success : function(rTypes) {
       Alert("success!);
   },
   error : function(XMLHttpRequest, textStatus, errorThrown) {
      alert("An error has occurred making the request: " + errorThrown);
   }
});
于 2012-04-16T21:36:45.973 回答
0

浏览器在 .ajax 调用时出现错误,因为我的 URL 中有端口号。当我从我的 QA URL 创建“实时” URL 时,端口号被转移。当我从 .ajax 调用的 URL 中删除端口号时,调用开始返回成功!

Jason Foglia,你的陈述“......还有港口......”促使我探索那个角度......非常感谢!

于 2012-04-17T14:22:02.163 回答