AJAX クロスドメイン ポリシーについて知っています。そのため、「 http://www.google.com 」を ajax HTTP リクエストで呼び出して、サイトのどこかに結果を表示することはできません。
dataType "jsonp" で試してみましたが、実際には機能しますが、構文エラーが発生します (受信したデータが JSON 形式ではないため)
外部ドメインからデータを受信/表示する他の可能性はありますか? iFrame は同じポリシーに従っていますか?
AJAX クロスドメイン ポリシーについて知っています。そのため、「 http://www.google.com 」を ajax HTTP リクエストで呼び出して、サイトのどこかに結果を表示することはできません。
dataType "jsonp" で試してみましたが、実際には機能しますが、構文エラーが発生します (受信したデータが JSON 形式ではないため)
外部ドメインからデータを受信/表示する他の可能性はありますか? iFrame は同じポリシーに従っていますか?
Andy Eが指摘したように、AJAX を使用してクロスドメイン データを取得する唯一の (簡単な) 方法は、サーバー側の言語をプロキシとして使用することです。jQuery を使用してそれを実装する方法の小さなサンプルを次に示します。
jQuery の部分:
$.ajax({
url: 'proxy.php',
type: 'POST',
data: {
address: 'http://www.google.com'
},
success: function(response) {
// response now contains full HTML of google.com
}
});
そして PHP (proxy.php):
echo file_get_contents($_POST['address']);
そのような単純な。スクレイピングされたデータでできることとできないことに注意してください。
データを参照するページに script タグを動的に挿入する必要があります。JSONP を使用すると、スクリプトがロードされたときにコールバック関数を実行できます。
JSONPのウィキペディア ページには簡潔な例があります。スクリプトタグ:
<script type="text/javascript" src="http://domain1.com/getjson?jsonp=parseResponse">
</script>
への呼び出しでラップされた JSON データを返しますparseResponse
。
parseResponse({"Name": "Cheeso", "Rank": 7})
getjson
( domain1.comのスクリプトの構成による)
タグを動的に挿入するコードは次のようになります。
var s = document.createElement("script");
s.src = "http://domain1.com/getjson?jsonp=parseResponse";
s.type = "text/javascript";
document.appendChild(s);
独自のプロキシをホストする必要なく、YQLを使用してリクエストを実行できます。コマンドを実行しやすくするために、単純な関数を作成しました。
function RunYQL(command, callback){
callback_name = "__YQL_callback_"+(new Date()).getTime();
window[callback_name] = callback;
a = document.createElement('script');
a.src = "http://query.yahooapis.com/v1/public/yql?q="
+escape(command)+"&format=json&callback="+callback_name;
a.type = "text/javascript";
document.getElementsByTagName("head")[0].appendChild(a);
}
jQuery がある場合は、代わりに $.getJSON を使用できます。
サンプルは次のようになります。
RunYQL('select * from html where url="http://www.google.com/"',
function(data){/* actions */}
);
残念ながら(または幸いなことに)そうではありません。クロスドメイン ポリシーが存在するのには理由があります。簡単に回避できるとしたら、セキュリティ対策としてはあまり効果的ではありません。JSONP 以外の唯一のオプションは、独自のサーバーを使用してページをプロキシすることです。
iframe では、同じポリシーが適用されます。もちろん、外部ドメインからのデータを表示することはできますが、それを操作することはできません。
私はこのコードをクロスドメイン ajax 呼び出しに使用しています。ここで複数の助けになることを願っています。私は Prototype ライブラリを使用していますが、JQuery や Dojo などでも同じことができます。
ステップ 1: 新しい js ファイルを作成し、このクラスを内部に配置します。これを xss_ajax.js と呼びます。
var WSAjax = Class.create ({
initialize: function (_url, _callback){
this.url = _url ;
this.callback = _callback ;
this.connect () ;
},
connect: function (){
var script_id = null;
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', this.url);
script.setAttribute('id', 'xss_ajax_script');
script_id = document.getElementById('xss_ajax_script');
if(script_id){
document.getElementsByTagName('head')[0].removeChild(script_id);
}
// Insert <script> into DOM
document.getElementsByTagName('head')[0].appendChild(script);
},
process: function (data){
this.callback(data) ;
}
}) ;
このクラスは、src 属性が JSON データ プロバイダーを対象とする動的なスクリプト要素を作成します (実際には、離れたサーバーがこの形式でデータを提供する必要があるため、JSON-P :: call_back_function(//json_data_here) :: したがって、スクリプト タグが作成されると、 JSON は関数として直接評価されます (ステップ 2 でコールバック メソッド名をサーバーに渡すことについて説明します)。これの背後にある主な概念は、スクリプトのような img 要素は SOP 制約に関係しないということです。
ステップ 2: JSON を非同期にプルする任意の html ページで (XHTTPRequest オブジェクトを使用する AJAX の代わりに、これを AJAJ ~ 非同期 Javascript + JSON と呼びます :-)) 以下のようにします。
//load Prototype first
//load the file you've created in step1
var xss_crawler = new WSAjax (
"http://your_json_data_provider_url?callback=xss_crawler.process"
, function (_data){
// your json data is _data and do whatever you like with it
}) ;
ステップ 1 のコールバックを覚えていますか? これをサーバーに渡すと、そのメソッドに埋め込まれた JSON が返されます。この場合、サーバーは評価可能な JavaScript コード xss_crawler.process(//the_json_data) を返します。xss_crawler は WSAjax クラスのインスタンスであることを思い出してください。サーバー コードはユーザー次第ですが (ユーザーの場合)、ほとんどの Ajax データ プロバイダーでは、パラメーターでコールバック メソッドを指定できます。Ruby on railsで私がやった
render :json=>MyModel.all(:limit=>10), :callback => params[:callback],:content_type => "application/json"
以上で、アプリ (ウィジェット、マップなど) から別のドメインのデータを JSON 形式でのみプルできるようになりました。忘れないでください。
お役に立てば幸いです。お待ちいただきありがとうございます:-)、コードのフォーマットについてはご容赦ください。うまく機能しません
php スクリプトを使用してリモート サーバーから応答を取得する場合は、先頭に次の行を追加します。
header("Access-Control-Allow-Origin: *");
いくつかの調査を行った後、この問題の唯一の「解決策」は次のように呼び出すことです。
if($.browser.mozilla)
netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
これは、ユーザーに Web サイトの続行を許可するかどうかを尋ねます。彼がそれを確認した後、データ型に関係なくすべての ajax 呼び出しが実行されます。
これは Mozilla ブラウザーで機能します。IE 8 未満では、ユーザーは同様の方法でクロス ドメイン コールを許可する必要があり、一部のバージョンではブラウザー オプション内で構成する必要があります。
chrome/safari: これまでのところ、これらのブラウザーの構成フラグは見つかりませんでした。
データ型として JSONP を使用するのはいいことですが、私の場合、アクセスする必要があるドメインがその形式のデータをサポートしているかどうかわかりません。
もう 1 つの方法は、クロスドメインでも機能する HTML5 postMessage を使用することですが、ユーザーを HTML5 ブラウザーに運命づける余裕はありません。
私の意見では、JSONP が最良の選択肢です。構文エラーが発生する理由を突き止めてみてください。受信したデータが JSON ではないことを確認してください。それなら、何らかの形で間違った API を使用している可能性があります。
使用できる別の方法ですが、あなたの場合には当てはまらないと思います.srcが呼び出したいドメインにあるページにiFrameを配置することです。呼び出しを実行してから、JS を使用して iFrame とページの間で通信します。これにより、クロスドメインがバイパスされますが、呼び出したいドメインに iFrame の src がある場合に限ります。
これは、凝ったものや JSON さえも使わずに、簡単に実行できる方法です。
まず、リクエストを処理するサーバー側スクリプトを作成します。http://www.example.com/path/handler.phpのようなもの
次のようにパラメータを指定して呼び出します: .../handler.php?param1=12345¶m2=67890
その中で、受信したデータを処理した後、次を出力します。
document.serverResponse('..all the data, in any format that suits you..');
// Any code could be used instead, because you dont have to encode this data
// All your output will simply be executed as normal javascript
ここで、クライアント側のスクリプトで、次を使用します。
document.serverResponse = function(param){ console.log(param) }
var script = document.createElement('script');
script.src='http://www.example.com/path/handler.php?param1=12345¶m2=67890';
document.head.appendChild(script);
このアプローチの唯一の制限は、サーバーに送信できるパラメーターの最大長です。ただし、いつでも複数のリクエストを送信できます。
私は2日間同じ問題に直面し、解決策を見つけました。たくさんグーグルした後、それはエレガントです。ティアのWebサイトからRailsアプリにデータストリームをプルするウィジェットクライアントには、xssAjaxが必要でした。 これが私のやり方です。