2
/*set the response header*/
    Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); 
    if (responseHeaders == null) { 
        responseHeaders = new Form(); 
        responseHeaders.add("Access-Control-Allow-Origin", "*");
        responseHeaders.add("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
        getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); 
    } 

これをrestlet 2.0コードに追加して、クロスドメインアクセスを可能にしました。これにより、最初のGETがページの読み込みで機能しますが、後で(バックボーンmodel.save()を使用して)POSTを実行しようとすると、ブラウザーはOptionsをaで送信します代わりに null エンティティ。

上記のコードを追加しなかった場合、正しい POST が送信されます

これは Opera、Firefox、および Chrome で発生します (Chrome を --disable-web-security で開始すると正常に動作します)、これはまだブラウザのセキュリティの問題であると思います。修正?

4

6 に答える 6

4

HTTP OPTIONS メソッドとは何ですか?から

このメソッドにより、クライアントは、リソースのアクションを示唆したり、リソースの取得を開始したりすることなく、リソースに関連付けられたオプションや要件、またはサーバーの機能を判断できます。

私はCORSの問題で何度か戦ってきましたが、常に試行錯誤の方法でそれらを解決してきました。あなたのケースに対する私の提案は、OPTIONSあなたのAllow Methodsに追加することです:

"Access-Control-Allow-Methods": "POST, GET, PUT, DELETE, OPTIONS"

Sinatra では、サーバーが , でOPTIONSリクエストに応答するようにします。*

options "/*" do
  "*"
end

アップデート

エラーに関するコメントで説明されている新しい問題についてheader field Content-Type is not allowed by Access-Control-Allow-Headers.

別の CORS ヘッダーを追加してみてください。

"Access-Control-Allow-Headers": "origin, x-requested-with, content-type"
于 2012-08-22T09:23:45.583 に答える
0

fguillen さんのアドバイスに感謝します。

/*set the response header*/
    Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); 
    if (responseHeaders == null) { 
        responseHeaders = new Form(); 
        responseHeaders.add("Access-Control-Allow-Origin", "*");
        responseHeaders.add("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS"); 
        responseHeaders.add("Access-Control-Allow-Headers", "Content-Type");
        getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); 
    } 

したがって、これは Restlet 2.0 の cors に挿入する正しいコードです。 responseHeaders.add("Access-Control-Allow-Headers", "Content-Type"); をお見逃しなく。少なくともバックボーンを扱っているとき

于 2012-08-22T09:44:36.267 に答える
0

以下のコードは、Restlet 2.0 のクロス ドメインの問題を解決するために使用できます。

Form responseHeaders = (Form) getResponse().getAttributes().get("org.restlet.http.headers"); 
if (responseHeaders == null) { 
    responseHeaders = new Form(); 
    getResponse().getAttributes().put("org.restlet.http.headers", responseHeaders); 
} 
responseHeaders.add("Access-Control-Allow-Origin", "*"); 
responseHeaders.add("Access-Control-Allow-Methods", "GET,DELETE,PUT,POST,OPTIONS");
responseHeaders.add("Access-Control-Allow-Headers", "Content-Type"); 
responseHeaders.add("Access-Control-Allow-Credentials", "false"); 
responseHeaders.add("Access-Control-Max-Age", "60");
于 2015-02-27T10:00:21.320 に答える