7

REST API のコネクタとなる jQuery プラグインを開発しています。実装は簡単ですが、同じオリジン ポリシーは確かに苦痛です。ほとんどの POST リクエストを実行する必要があります。

OPTIONSメソッドの実装もやってみました(pythonですが、意味ははっきりしているはずです)

def options(self):
  self.response.headers['Access-Control-Allow-Origin'] = self.request.host_url
  self.response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS'
  self.response.headers['Access-Control-Allow-Headers'] = 'x-requested-with'
  self.response.headers['Access-Control-Max-Age'] = '1728000'

まだ機能しません...何か考えはありますか?

PS: 同様のトピックに関する他の質問があることを確認しましたが、POST メソッドの特定のソリューションが必要です (GET は iframe を使用して簡単に実装できます)。

Javascript の例:

$.ajax({
    url: options.protocol+'://'+options.host+':'+options.port+'/'+method,
    data: rawData,
    async:false,
    dataType: "json",
    type:"POST",
    success:function(data)
    {
        alert('asd');
        result.data = data;
        alert(data);
    },
    error:function(lol){
        alert('omggg !!!!'+lol);
    }

});

編集: JavaScript コード例を追加

4

1 に答える 1

9

それは時々フィドルのビットです、いくつかの考え:

  • CORS はかなり最新のブラウザーでのみサポートされているため、それらのいずれかを使用していることを確認する必要があります。
  • XDomainRequestIEは、標準オブジェクトではなく、オブジェクトを介した CORS のみをサポートしXMLHttpRequestますが、jQuery は特にそれをサポートしていません (まだ; 少し驚いたことを認めなければならず、すぐにそうなると思います)、特別な処理を追加する必要があります。これを IE で動作させる (IE8 以降のみ)。編集: 驚くべきことに、どうやら jQuery チームはその要求を受け取り、それを拒否したようです:チケット #8283それは意味がありません
  • あなたはそのAccess-Control-Allow-Origin値について確信がありますか?そのサーバーからのアクセスのみを許可しているようです。そのヘッダーは、サーバーがリクエストの送信元を許可するオリジンを指定するためのものです。(そして*、「どこでも」という意味で許可されています。)
  • OPTIONSこれに関する Firefox での実験から、要求されていないリクエストに応答する際の許可メソッドに気を遣っていたことを思い出すようです。
  • リクエストが送信するすべてのヘッダーを許可していることを再確認してください。あなたの例では、1 つのヘッダー ( ) のみを許可しているように見えますがx-requested-with、実際の要求には他のヘッダーがあるはずです。

FWIW (私は Python の専門家ではありません)。動作する JSP コードは次のとおりです。おそらく役に立つでしょう — Java を使用していなくても、オブジェクト名は十分に読みやすいと思います (そして、誰が知っているか、おそらくあなたは行う):

String corsOrigin, corsMethod, corsHeaders;

// Find out what the request is asking for
corsOrigin = request.getHeader("Origin");
corsMethod = request.getHeader("Access-Control-Request-Method");
corsHeaders = request.getHeader("Access-Control-Request-Headers");
if (corsOrigin == null || corsOrigin.equals("null")) {
    // Requests from a `file://` path seem to come through without an
    // origin or with "null" (literally) as the origin.
    // In my case, for testing, I wanted to allow those and so I output
    // "*", but you may want to go another way.
    corsOrigin = "*";
}

// Add headers allowing specifically what was requested
response.addHeader("Access-Control-Allow-Origin", corsOrigin);
response.addHeader("Access-Control-Allow-Methods", corsMethod);
response.addHeader("Access-Control-Allow-Headers", corsHeaders);
if (request.getMethod().equals("OPTIONS"))
{
    // Done, no body in response to OPTIONS
    return;
}
// Processing the GET or POST here; output the body of the response

、 、およびOPTIONS の場合はレスポンス本文を出力しないことを除いてGET、まったく同じロジックを使用していることに注意してください。POSTOPTIONS

于 2011-05-06T07:44:54.680 に答える