jquery リクエストは次のとおりです:
angularjs のリクエストは次のとおりです:
2 つのリクエストの違いをよく見てください。jquery のデフォルトの content-type は application/x-www-form-urlencoded であり、これは単純なリクエストです。プリフライトは必要ありません (2 番目の寫真のオプションのリクエストです)。 angular の post リクエストのデフォルトの content-type は application/json です。これは主にプリフライト用の複雑なリクエストです。ただし、エラーが発生するということは、バックエンドがオプションの狀況を処理できないことを意味します: # ????#
jquery を使用してリクエストを送信すると、レスポンスの応答ヘッダーが Access-Control-Allow-Origin に設定されるため、ドメインを越えることができることに注意してください。
しかし、Angular で送信すると、このヘッダーは存在しません。これは、サーバー側(cè)の応答のロジックが何らかの判斷を行って、このヘッダーが正常に設定されないためです。
@Evian Angular がプリフライトが必要であると考えているのではなく、ブラウザーが考えているのです (Angular の HTTP リクエストの構(gòu)成、Content-Type
および Cache-Control
のため、 MDN ドキュメントによると) はプリフライトを開始する必要があります。 Content-Type
和 Cache-Control
,根據(jù) MDN 文檔)需要發(fā)起 preflight。
@YAN_YANG 從響應頭來看,你的服務器允許 preflight 請求,你可以從服務端把這個刪掉。不清楚你是怎么配置 CORS 的,舉個例子比如在 Apache 里有類似的設置:
Header set Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"
把 OPTIONS
選項去掉可以直接避免去響應 preflight,當然你合理的處理它才是正確的。(參見:http://stackoverflow.com/questions/23954433/post-request-with-angularj...)
另外你 Angular 那邊設置了正確的 request headers 嗎?(針對 CORS 的)
http://chstrongjavablog.blogspot.sg/2013/04/enabling-cors-for-jetty.ht...
這篇文章解釋了 OPTIONS 的種種困擾,以及為什么 jQuery 沒問題(針對 CORS 專門去除了 HEADER),另外還有一個 Java 的 CORS 實現(xiàn),和請求時 HEADER 的設置。Angular 怎么設,查 $httpProvider
OPTIONS
オプションを削除すると、プリフライトへの応答を直接回避できます。もちろん、それを適切に処理するのは正しいことです。 (參照: http://stackoverflow.com/questions/23954433/post-request-with-angularj...) ??
??また、Angular で正しいリクエスト ヘッダーを設定しましたか? (CORS用) ??
??http://chstrongjavablog.blogspot.sg/2013/04/enabling-cors-for-jetty.ht...??
??この記事では、OPTIONS に関するさまざまな問題と、jQuery が適切である理由について説明します (CORS では HEADER が特に削除されます)。また、Java CORS の実裝とリクエスト中の HEADER の設定についても説明します。 Angular をセットアップするには、$httpProvider
のドキュメントを確認してください。 ??