3

私のアプリケーションの HTML5、jQuery Mobile フロントエンドは Java サーバー (Spring、Hibernate、MySQL) と通信します。アプリケーションは、QA 環境だけでなく、私のノートブックでも問題なく動作します。QA では、サーバーの IP アドレスを使用してアプリケーションにアクセスしています。Live 環境 (QA と同じサーバーで Tomcat の別の Web アプリ) でアプリケーションをホストし、ドメイン名の URL を使用してアプリケーションにアクセスしようとすると、アプリケーションの $.ajax 呼び出しでエラーが返されます。

呼び出しの 1 つは次のとおりです。

$.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 サービスが正常に呼び出されたことがわかりますが、クライアントがデータを受信して​​いないようです!

URLを叩いたら

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

ここで何が問題なのか誰か教えてもらえますか? とても有難い!

私は問題を解決することができました:

URL にポート番号が含まれていたため、ブラウザーは .ajax 呼び出しでエラーを出していました。QA URL から「ライブ」URL を作成したときに、ポート番号が引き継がれました。.ajax 呼び出しの URL からポート番号を削除すると、呼び出しが成功を返し始めました。

ジェイソン・フォグリア、あなたの声明「...そしてポートも...」は、私にその角度を探求するよう促しました...どうもありがとう!

4

3 に答える 3

4

異なるドメインからサービスを呼び出すことを許可しない「same origin policy」と呼ばれるセキュリティの概念のために、おそらくエラーが発生しています。または、少なくとも、そのサービスでメソッドを呼び出すことを禁止します。

同じ議論がここにあります - AJAX Cross Domain

ただし、JSONP を使用してクロスドメインを実装することはできます - Wikipedia on 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

URL にポート番号が含まれていたため、ブラウザーは .ajax 呼び出しでエラーを出していました。QA URL から「ライブ」URL を作成したときに、ポート番号が引き継がれました。.ajax 呼び出しの URL からポート番号を削除すると、呼び出しが成功を返し始めました。

ジェイソン・フォグリア、あなたの声明「...そしてポートも...」は、私にその角度を探求するよう促しました...どうもありがとう!

于 2012-04-17T14:22:02.163 に答える