7

HTML、CSS、Javascript コードを使用してフロントエンドを構築するアプリケーションを使用しています。バックエンドは、コア Java、Restlet を使用して作成されます。

本当の問題は、フロントエンドとバックエンドの両方が、差分ポートを備えた差分サーバー上にあることです。のように、フロントエンドはオンです: http://clientLookup(ほんの一例) そしてバックエンドはオンです,http://lcgrke:8080

Ajax RequestまたはjQuery Ajaxを介してフロントエンドからサーバーまたは残りの呼び出しを送信すると、クロスサイドスクリプティングの問題が発生します(SOP - 同じオリジンポリシー)。これを回避する方法がわかりません。

JSONP はオプションの 1 つにすることができますが、GET タイプの呼び出しでのみ機能しますが、私のアプリケーションでは GET/POST 要求があります。また、サーバーの一部の URL は JSONP が有効にならないため (理由は聞かないでください。編集できないことを受け入れてください)、JSONP はより良いオプションではないようです。

この問題を回避する方法を教えてください。

4

5 に答える 5

0

PHP を使用していて、php_culr ライブラリを利用できる場合は、クロス オリジンをサーバーに活用することをお勧めします。ここで例を見ることができます: http://davidwalsh.name/curl-post または、file_get_contents関数を使用して、投稿されたパラメーターをシリアル化するか、(必要な場合) 必要な get パラメーターを渡すだけです。

お役に立てれば。

于 2013-08-06T14:57:08.837 に答える
0

Ben Alman は、この種の状況に対する一時的な回避策として私が使用した簡単なプロキシ スクリプトを提供しています。

基本的に、curl を使用して GET および POST リクエストを転送します。

http://benalman.com/projects/php-simple-proxy/

$url = $_GET['url'];
$ch = curl_init( $url );
curl_setopt($ch, CURLOPT_VERBOSE, true);
if ( strtolower($_SERVER['REQUEST_METHOD']) == 'post' ) {
  curl_setopt( $ch, CURLOPT_POST, true );
  //curl_setopt( $ch, CURLOPT_POSTFIELDS, $_POST );

  $vin = $_POST["vin"];
  $subscriberProgramXML = $_POST["subscriberProgramXML"];

  $data = array("vin" => $vin, "subscriberProgramXML" => $subscriberProgramXML);
  $data_string = json_encode($data);

  $httpHeader = array('Content-Type: application/json', 'Content-Length: ' .strlen($data_string));

  curl_setopt( $ch, CURLOPT_POSTFIELDS, $data_string);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader);
}

curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_HEADER, true );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );

curl_setopt( $ch, CURLOPT_USERAGENT, $_GET['user_agent'] ? $_GET['user_agent'] : $_SERVER['HTTP_USER_AGENT'] );


list( $header, $contents ) = preg_split( '/([\r\n][\r\n])\\1/', curl_exec( $ch ), 2 );

$status = curl_getinfo( $ch );

curl_close( $ch );

// Set the JSON data object contents, decoding it from JSON if possible.
$decoded_json = json_decode( $contents );
$data['contents'] = $decoded_json ? $decoded_json : $contents;

// Generate appropriate content-type header.
$is_xhr = strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest';
header( 'Content-type: application/' . ( $is_xhr ? 'json' : 'x-javascript' ) );

// Get JSONP callback.
$jsonp_callback = $enable_jsonp && isset($_GET['callback']) ? $_GET['callback'] : null;

// Generate JSON/JSONP string
$json = json_encode( $data );

print $jsonp_callback ? "$jsonp_callback($json)" : $json;

そのコードは元の php からコピーペーストされていますが、コードの一部にすぎません。それは解決策を示しています。

于 2013-09-10T16:22:29.207 に答える
0

@Manoloが言ったように、CORSを使用する方法があります(詳細はこちらで確認できます:http://blogs.mulesoft.org/cross-domain-rest-calls-using-cors/ -免責事項:私はその記事を書きましたが、この回答を自己宣伝にしないために、CORS を検索すると、同様の記事が見つかります)。

Manolo の応答に追加できる唯一のことは、jQuery を使用する場合、IE の XDomainRequest について心配する必要がないということです。jQuery はこれらのブラウザーの互換性の詳細を考慮に入れるためです。

また、Restlet を使用しているため、次の記事が役立ちます: http://kodemaniak.de/2010/07/cross-domain-ajax-with-restlet-and-jquery/

私は Restlet を使用したことはありませんが、Java ベースであるため、CORS を追加する他の簡単なオプションはフィルターを作成または使用することです。Apache ライセンス フィルターの実装は次のとおりです: https://bitbucket.org/thetransactioncompany/cors-filter/src

于 2013-09-14T05:31:19.757 に答える
0

クロスサイト リクエストを処理する最新の方法は、 JSONPの代わりにCORSを使用することですが、どのブラウザーが CORS をサポートしているかを認識する必要があります。

CORS はほぼ最新のブラウザー (IE10、FF、Chrome、Safari、Opera) で使用できますが、IE9/8 では使用できません。

IE9/8では、 XDomainRequestと呼ばれる別の手法を使用できますが、JSNI 経由で実装する必要があります。

CORS と JSONP を使用する目的は、サーバー側でフィルターを追加するだけで、すべてがすぐに使用できるようにすることです (RPC、RF など)。

gwtで CORS を使用するには、フィルターの例があるgwtquery サイトでこのページを読むことができます。そのページには、jsonp に関する有用な情報と、gwt RequestBuilder の方法を簡素化する gwtquery ajax の使用方法も記載されています。

于 2013-07-26T08:57:28.220 に答える