AJAXドメイン間問題の説明
4454 ワード
ドメイン間で問題が発生したのはなぜですか?
###[ドメイン間で発生した理由]
1.ブラウザの制限2.ドメイン間(プロトコル、ドメイン名、ポートのいずれかが異なる)3.XHR(XMLHttpRequest)リクエスト
つまり、XMLHttpRequestリクエストが異なるドメイン名を送信すると、ブラウザがアクセスを制限し、ドメイン間の問題が発生します.
###[ドメイン間問題解決の考え方]
1.クライアントブラウザパラメータを変更して制限ブラウザ起動加入を解除する
##ドメイン間の問題解決方法
1.JSONPはドメイン間解決
[原理]:
[jsonpリクエスト ]
[jsonpリクエスト ]
2.ドメイン ソリューションCORS
CORSはW 3 C であり、 は「クロスドメインリソース 」(Cross-origin resource sharing)である.CORSにはブラウザとサーバの サポートが です. 、すべてのブラウザがこの をサポートしており、IEブラウザはIE 10を ってはならない.
これにより、ブラウザがソース サーバにXMLHttpRequestリクエストを することができ、AJAXがソースとしか できない を します.CORS プロセス は、ブラウザが に し、ユーザーが する はありません. にとってCORS は のAJAX と がなく,コードは く じである.ブラウザがAJAXリクエストがソース であることを すると、 に のヘッダ が され、 のリクエストが1 えることもありますが、ユーザーは じません.したがって,CORS を する はサーバである.サーバがCORSインタフェースを すれば,ソース が となる.
[ リクエスト-postリクエスト]
: び しサービス Access-Control-Allow-Origin
び されたサービス Access-Control-Allow-Methods
[ リクエスト-クッキー きリクエスト]
:クッキーを っている 、originは に しなければならず、*を できません.
び されたサービス Access-Control-Allow-CRedentials
[ でないリクエスト-ヘッダ きリクエスト]
:クッキーを っている 、originは に しなければならず、*を できません.
び されたサービス Access-Control-Allow-Header
より、
3.Nginxエージェント
もし たちが するときにフロントエンドのドメイン を うならば、Nginxは たちにこの を のバックエンドのドメイン に してくれます
[Nginx ]
リクエスト& リクエスト
の2つの を に たす り、 な に し、 りは な に する.
(1) は、HEAD、GET、POSTの3つの の1つである
(2)HTTPのヘッダ は のフィールドを えない(カスタムヘッダなし):
(3)Content-Type:3つの のみ
コードワードは ではありません.もしあなたに に つと ったら、 さな ましをあげましょう(.)!
###[ドメイン間で発生した理由]
1.ブラウザの制限2.ドメイン間(プロトコル、ドメイン名、ポートのいずれかが異なる)3.XHR(XMLHttpRequest)リクエスト
つまり、XMLHttpRequestリクエストが異なるドメイン名を送信すると、ブラウザがアクセスを制限し、ドメイン間の問題が発生します.
###[ドメイン間問題解決の考え方]
1.クライアントブラウザパラメータを変更して制限ブラウザ起動加入を解除する
--disable-web-security
2.JsonpはXHR要求の問題を解決する.3.ドメイン間:呼び出し元がドメイン間、呼び出し元の非表示要求をサポートする##ドメイン間の問題解決方法
1.JSONPはドメイン間解決
[原理]:
は に されない:JSONP
ラベルは、
び しにより する、 り もjs、 callbackパラメータの 、 パラメータは るjsonオブジェクト()である[ ]:1.Getリクエストのみサポート2.XHRリクエストではない [jsonpリクエスト ]
$.ajax({
url: 'url",
dataType: "jsonp",
jsonp: "callback",
cache: true,
success: function(json) {
result = json;
}
});
[jsonpリクエスト ]
// script
function addScriptTag(src) {
var script = document.createElement('script');
script.setAttribute("type","text/javascript");
script.src = src;
document.body.appendChild(script);
}
window.onload = function () {
addScriptTag('http://example.com/ip?callback=foo');
}
// -
function foo(data) {
console.log('Your public IP address is: ' + data.ip);
};
2.ドメイン ソリューションCORS
CORSはW 3 C であり、 は「クロスドメインリソース 」(Cross-origin resource sharing)である.CORSにはブラウザとサーバの サポートが です. 、すべてのブラウザがこの をサポートしており、IEブラウザはIE 10を ってはならない.
これにより、ブラウザがソース サーバにXMLHttpRequestリクエストを することができ、AJAXがソースとしか できない を します.CORS プロセス は、ブラウザが に し、ユーザーが する はありません. にとってCORS は のAJAX と がなく,コードは く じである.ブラウザがAJAXリクエストがソース であることを すると、 に のヘッダ が され、 のリクエストが1 えることもありますが、ユーザーは じません.したがって,CORS を する はサーバである.サーバがCORSインタフェースを すれば,ソース が となる.
[ リクエスト-postリクエスト]
: び しサービス Access-Control-Allow-Origin
び されたサービス Access-Control-Allow-Methods
res.addHeader("Access-Control-Allow-Origin", "*") //
res.addHeader("Access-Control-Allow-Methods", "*") //
[ リクエスト-クッキー きリクエスト]
$.ajax({
type: "get",
url: "url",
xhrFields: {
withCredentials: true
},
success: function(json) {
result = json;
}
});
:クッキーを っている 、originは に しなければならず、*を できません.
び されたサービス Access-Control-Allow-CRedentials
res.addHeader("Access-Control-Allow-Origin", "localhost:8081")
res.addHeader("Access-Control-Allow-Methods", "*")
res.addHeader("Access-Control-Allow-Credentials", "true") //enable cookie
[ でないリクエスト-ヘッダ きリクエスト]
$.ajax({
type: "get",
url: 'url",
headers: {
"x-header1": "AAA"
},
beforeSend: function(xhr) {
xhr.setRequestHeader("x-header2", "BBB")
},
success: function(json) {
result = json;
}
});
:クッキーを っている 、originは に しなければならず、*を できません.
び されたサービス Access-Control-Allow-Header
res.addHeader("Access-Control-Allow-Origin", "*")
res.addHeader("Access-Control-Allow-Methods", "*")
res.addHeader("Access-Control-Allow-Header", "content-Type,x-header1,x-header2")
より、
// cookie ,origin , *
String origin = req.getHeader("Origin");
if (!org.springframework.util.StringUtils.isEmpty(origin)) {
res.addHeader("Access-Control-Allow-Origin", origin);
}
res.addHeader("Access-Control-Allow-Methods", "*");
// ( )
String headers = req.getHeader("Access-Control-Request-Headers");
if (!org.springframework.util.StringUtils.isEmpty(headers)) {
res.addHeader("Access-Control-Allow-Headers", headers);
}
res.addHeader("Access-Control-Max-Age", "3600");
// enable cookie
res.addHeader("Access-Control-Allow-Credentials", "true");
3.Nginxエージェント
もし たちが するときにフロントエンドのドメイン を うならば、Nginxは たちにこの を のバックエンドのドメイン に してくれます
[Nginx ]
server{
# 9000
listen 9000;
# localhost
server_name localhost;
# localhost:9000/api , http://localhost:9001
location ^~ /api {
proxy_pass http://localhost:9001;
}
}
リクエスト& リクエスト
の2つの を に たす り、 な に し、 りは な に する.
(1) は、HEAD、GET、POSTの3つの の1つである
(2)HTTPのヘッダ は のフィールドを えない(カスタムヘッダなし):
Accept
Accept-Language
Content-Language
Last-Event-ID
(3)Content-Type:3つの のみ
application/x-www-form-urlencoded
multipart/form-data
text/plain
コードワードは ではありません.もしあなたに に つと ったら、 さな ましをあげましょう(.)!