2011-10-20 9 views
1

ローカルホストからJSONとしてデータを取得すると、すべてOKです。リモートマシンからそのJSONデータを取得しようとすると、すべてがOKです。 JSONデータがローカルホストからオブジェクト(データグリッドプラグイン:jqgridがレンダリングするオブジェクト)に変換されることを解析できます。しかし、私がリモートソースを使用しようとすると、それはしません。火かき棒では200 OKと表示されますが、エラーアイコンが表示され、赤色に表示されます。私は自分のローカルホストとリモート接続ヘッダの違いを確認し、私はそのヘッダがリモート接続ではありませんことを発見:X-Requested-With:XMLHttpRequest(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:私は、WebサーバーとしてRESTとTomcatと共にSpring 3を使用します。

+0

[こちら](http://jpgmr.wordpress.com/2010/07/28/tutorial-implementing-a-servlet-filter-for-jsonp-callback-with-springs-delegatingfilterproxy/)をご覧くださいSpringでJSONPを実装する必要があります。 – Oleg

答えて

0

あなたはCross-site scripting号があると思います。サーバーが応答のHTTPヘッダーにadditional optionsを設定すると、この問題は解決できます。したがって、現在のようにクライアントコードを変更するのではなく、サーバーコードで解決することができます。

tables.googlelabs.comで設定されているHTTPオプションをthe demoで、the answerから調べることをお勧めします。

X-Content-Type-Options: nosniff 
X-Frame-Options: SAMEORIGIN 
X-XSS-Protection: 1; mode=block 

とJSONレスポンスは jsonCallbackパラメータで定義された関数の呼び出しの内部に配置されます:あなたは、サーバーの応答は次の追加のHTTPオプションを持っていることがわかります。 jsonCallback=?を使用する場合、jqGridは関数名( jQuery16407707202236448429_1319101394784のようなもの)を生成します。 X-XSS-Protectionオプション hereと約 X-Content-Type-Options: nosniffオプション hereについて詳しく読むことができます。

the demoで見ると、データはjqGridに表示されるため、クロスサイトスクリプティングはjqGridで実装できます。私たちはjqGridページングやソートのパラメータをサポートしていないサーバーtables.googlelabs.comを呼び出すので

は、私が代わりにpostData値としてオブジェクトの文字列の使用量が他jqGridが上書きされます

url: 'http://tables.googlelabs.com/api/query?jsonCallback=?', 
postData: "sql=" + encodeURIComponent("SELECT * FROM 333136 LIMIT 10") 

デモで使用されます典型的には掲示されるパラメータ。あなたの場合、これを行う必要はなく、たぶんurl: 'http://xx.xx.x.xxx:8080/aa/bb/cc/user?jsonCallback=?'を使用するだけです。

いずれにしても、サーバー上でJSONPのサポートを実装する必要があります。これは、サーバがjsonCallbackパラメータを「理解する」ことを意味します。実装は、サーバー側の実装に依存します。 WCFサービスの場合は、webHttpBindingのバインド設定はcrossDomainScriptAccessEnabled="true"となる場合があります(hereの例、web.configの例を参照)。さらに、ASP.NET WebサービスとASP.NET MVCについては、this answerthis one(またはthis one)を参照してください。

関連する問題