web-dev-qa-db-ja.com

jQueryを使用して別のポートでAJAXリクエストを送信するにはどうすればよいですか?

たとえば、デーモンが実行されているポート8080にAJAXリクエストを送信する必要があります。

37
user198729

ドメイン、サブドメイン、またはポート番号を越えてPOST情報を使用することはできません。ただし、デーモンand要求サイトの両方にアクセスできる場合はJSONPを使用できます。データを返す必要がある場合、daemoncallbackクエリパラメータをサポートし、適切にフォーマットされた状態で返す必要があります。

情報をデーモンに渡します。

$.getJSON('http://domain.com:8080/url/here?callback=?', {
  key: 'value',
  otherKey: 'otherValue'
}, function(data){
     // Handles the callback when the data returns
});

デーモンがcallbackパラメーターを処理することを確認してください。たとえば、callback=mycallbackデーモンからの戻り(ページに書き込まれる唯一のもの)は次のようになります。

キー/値ペアの場合:

mycallback( {'returnkey':'returnvalue', 'other':'data' });

配列の場合:

mycallback( [1,2,3] );

JSONPまたは同様のメカニズムが設定されていない場合、jQueryを使用してドメイン間で通信することはできません。

31
Doug Neiner

これにより、 Same Origin policy が破られます。同じドメインを使用している場合でも、別のポートを使用することはできません。

JSONPを Doug 提案として使用できます。

または、別の可能な回避策として、非常に単純な reverse proxy (Apacheを使用している場合は mod_proxy を使用)を設定できます。これにより、AJAXリクエストで相対パスを使用できますが、HTTPサーバーは「リモート」ロケーションへのプロキシとして機能します。

mod_proxy でリバースプロキシを設定するための基本的な設定ディレクティブはProxyPassです。通常、次のように使用します。

ProxyPass     /ajax/     http://www.localhost:8080/

この場合、/ajax/test.xml jQueryを使用しますが、実際にはサーバーはhttp://www.localhost:8080/test.xml内部的に。

IISを使用している場合は、 Managed Fusion URL Rewriter and Reverse Proxy を使用して、リバースプロキシをセットアップできます。

41
Daniel Vassallo

同じボックス、異なるポートにある場合でも、これは異なるオリジンとしてカウントされます。

FireFox 3.5以降のようなほとんどの新しいブラウザをターゲットにしている場合は、Access-Controlヘッダーを別のポートのアプリケーションに追加し、デフォルトのアプリプールからの呼び出しを許可します。アクセス制御ヘッダーに関する情報は、ここにあります: https://developer.mozilla.org/en/HTTP_access_control

IEはそれも実装しています(別のACTIVEXコントロールを使用しているのに、なぜそうですか?): http://blogs.msdn.com/ie/archive/2009/01/14/completing-access-control-support -for-xdomainrequest.aspx および http://msdn.Microsoft.com/en-us/library/cc288060(VS.85).aspx

2
naivists