Spring MVC を使用して REST API バックエンドを構築し、Spring Security を使用して基本認証で保護しました。
Javascript クライアントから REST API へのクロス ドメイン ajax 呼び出しを実行したいと考えています。GET 呼び出しに制限されたくないので、JSONP を使用したくありません。私は CORS を使用しており、サーバー側に適切なヘッダーを配置しています。
私の REST API がドメイン localhost:8087 にあり、私のクライアントが localhost:8086 にあるとします。これはクロス ドメイン コールです。
私のJavascriptクライアントでは、jQueryでajax呼び出しを行います:
<script>
$.ajax ({
url: "http://localhost:8087/SpringMVC/users/user1",
beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", "Basic xxxxxxxxxxxx"); },
success: function(val) { console.log(val); alert("success" + val); },
error: function(val) { console.log(val); alert("error" + val); }
});
</script>
私の問題は、jQuery が HTTP 要求で Authorization ヘッダーを送信しないことです。その理由はわかりません。beforeSendメソッドでやるからわからないので、HTTPリクエスト内にあるはずです。結果: 401 エラーが発生しました。
クロスドメインではない同じドメイン localhost:8087 からスクリプトを試すと、問題はありません。
どのように可能ですか?
私のスクリプトは単なるテストです。ユーザー名/パスワードをクライアント側に置くつもりはありません。しかし、認証で保護された基本的な REST API に対して ajax 呼び出しを行う方法をテストしたいと考えています。ユーザー名/パスワードを安全にするためにサーバー側で送信する必要があると思います。REST API は Cookie を返します。REST API への次の ajax 呼び出しでユーザー名/パスワードを渡す必要はもうありません。私は正しいですか?
Chrome Advanced REST クライアントで REST API をテストしましたが、そのように動作しています。最初のリクエストでは、認証ヘッダーを渡す必要があります。それなら必要ありません。私のjavascript Webクライアントでもそのように動作するはずですか? Node.JS と Backbone を使用してビルドするつもりです。
どうもありがとう。
EDIT2:本当にCORSブラウザの問題のようです。サーバー側でOPTIONSメソッドのヘッダーAccess-Control-Allow-Methodsを追加しましたが、Chromeで動作します。もうエラーなしで JSON 応答にアクセスできます。しかし、次のリクエストには認証ヘッダーを使用する必要があります。送信されたCookieを使用するようjQueryに指示する方法は?
そして、Firefox 11を試してみると、json応答にアクセスできず、エラーが発生しました:
"NetworkError: 401 Non-Autorisé - http://localhost:8087/SpringMVC/users/user1"