±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ51cto
,¿çÓòÕâ¸ö´Ê¾ÍÒ»Ö±ÒÔºÜ¸ßµÄÆµÂÊÔÚÉí±ßÖØ¸´³öÏÖ£¬ËùÒÔÎÄÖÐÖ»Òª½²½âÁË¿çÓòµÄÏà¹ØÁ÷³Ì£¬°üÀ¨¸ÅÄîµÈµÈ |
|
Ìâ¸Ù
¹ØÓÚ¿çÓò£¬ÓÐNÖÖÀàÐÍ£¬±¾ÎÄֻרעÓÚ ajaxÇëÇó¿çÓò(ajax¿çÓòÖ»ÊÇÊôÓÚä¯ÀÀÆ÷"ͬԴ²ßÂÔ"ÖеÄÒ»²¿·Ö£¬ÆäËüµÄ»¹ÓÐCookie¿çÓòiframe¿çÓò£¬LocalStorage¿çÓòµÈÕâÀï²»×ö½éÉÜ)£¬ÄÚÈÝ´ó¸ÅÈçÏ£º
ʲôÊÇajax¿çÓò
ÔÀí
±íÏÖ(ÕûÀíÁËһЩÓöµ½µÄÎÊÌâÒÔ¼°½â¾ö·½°¸)
ÈçºÎ½â¾öajax¿çÓò
JSONP·½Ê½
CORS·½Ê½
´úÀíÇëÇó·½Ê½
ÈçºÎ·ÖÎöajax¿çÓò
http×¥°üµÄ·ÖÎö
һЩʾÀý
ʲôÊÇajax¿çÓò
ajax¿çÓòµÄÔÀí
ajax³öÏÖÇëÇó¿çÓò´íÎóÎÊÌâ,Ö÷ÒªÔÒò¾ÍÊÇÒòΪä¯ÀÀÆ÷µÄ¡°Í¬Ô´²ßÂÔ¡±,¿ÉÒԲο¼
ä¯ÀÀÆ÷ͬԴÕþ²ß¼°Æä¹æ±Ü·½·¨(ÈîÒ»·å)
CORSÇëÇóÔÀí
CORSÊÇÒ»¸öW3C±ê×¼£¬È«³ÆÊÇ"¿çÓò×ÊÔ´¹²Ïí"£¨Cross-origin resource
sharing£©¡£ËüÔÊÐíä¯ÀÀÆ÷Ïò¿çÔ´·þÎñÆ÷£¬·¢³öXMLHttpRequestÇëÇ󣬴Ӷø¿Ë·þÁËAJAXÖ»ÄÜͬԴʹÓõÄÏÞÖÆ¡£
»ù±¾ÉÏĿǰËùÓеÄä¯ÀÀÆ÷¶¼ÊµÏÖÁËCORS±ê×¼,ÆäʵĿǰ¼¸ºõËùÓеÄä¯ÀÀÆ÷ajaxÇëÇó¶¼ÊÇ»ùÓÚCORS»úÖÆµÄ,Ö»²»¹ý¿ÉÄÜÆ½Ê±Ç°¶Ë¿ª·¢ÈËÔ±²¢²»¹ØÐĶøÒÑ(ËùÒÔ˵ÆäʵÏÖÔÚCORS½â¾ö·½°¸Ö÷ÒªÊÇ¿¼ÂǺǫ́¸ÃÈçºÎʵÏÖµÄÎÊÌâ)¡£
¹ØÓÚCORS£¬Ç¿ÁÒÍÆ¼öÔĶÁ £º¿çÓò×ÊÔ´¹²Ïí CORS Ïê½â(ÈîÒ»·å)(http://www.ruanyifeng.com/blog/2016/04/cors.html)
ÁíÍ⣬ÕâÀïÒ²ÕûÀíÁËÒ»¸öʵÏÖÔÀíͼ(¼ò»¯°æ):

ÈçºÎÅжÏÊÇ·ñÊǼòµ¥ÇëÇó?
ä¯ÀÀÆ÷½«CORSÇëÇó·Ö³ÉÁ½Àࣺ¼òµ¥ÇëÇó£¨simple request£©ºÍ·Ç¼òµ¥ÇëÇó£¨not-so-simple
request£©¡£Ö»ÒªÍ¬Ê±Âú×ãÒÔÏÂÁ½´óÌõ¼þ£¬¾ÍÊôÓÚ¼òµ¥ÇëÇó¡£
ÇëÇó·½·¨ÊÇÒÔÏÂÈýÖÖ·½·¨Ö®Ò»£ºHEAD¡¢GET¡¢POST¡£
HTTPµÄÍ·ÐÅÏ¢²»³¬³öÒÔϼ¸ÖÖ×ֶΣº
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type(Ö»ÏÞÓÚÈý¸öÖµapplication/x-www-form-urlencoded¡¢
multipart/form-data¡¢text/plain)
·²ÊDz»Í¬Ê±Âú×ãÉÏÃæÁ½¸öÌõ¼þ£¬¾ÍÊôÓڷǼòµ¥ÇëÇó¡£
ajax¿çÓòµÄ±íÏÖ
˵ʵ»°£¬µ±³õÕûÀí¹ýһƪÎÄÕ£¬È»ºó×÷ΪÁËÒ»¸ö½â¾ö·½°¸£¬µ«ÊǺóÀ´·¢ÏÖÈÔÈ»ÓкܶàÈË»¹ÊDz»»á¡£ÎÞÄÎÖ»ÄܺÄʱÓÖºÄÁ¦µÄµ÷ÊÔ¡£È»¶ø¾ÍËãÊÇÎÒÀ´·ÖÎö£¬Ò²Ö»»á¸ù¾Ý¶ÔÓ¦µÄ±íÏÖÀ´ÅжÏÊÇ·ñÊÇ¿çÓò£¬Òò´ËÕâÒ»µãÊǺÜÖØÒªµÄ¡£
ajaxÇëÇóʱ£¬Èç¹û´æÔÚ¿çÓòÏÖÏ󣬲¢ÇÒûÓнøÐнâ¾ö£¬»áÓÐÈçϱíÏÖ¡£(×¢Ò⣬ÊÇajaxÇëÇó£¬Ç벻Ҫ˵ΪʲôhttpÇëÇó¿ÉÒÔ£¬¶øajax²»ÐУ¬ÒòΪajaxÊǰéËæ×Å¿çÓòµÄ£¬ËùÒÔ½ö½öÊÇhttpÇëÇóokÊDz»ÐеÄ)
×¢Ò⣺¾ßÌåµÄºó¶Ë¿çÓòÅäÖÃÇë¿´Ìâ¸ÙλÖá£
µÚÒ»ÖÖÏÖÏó
No'Access-Control-Allow-Origin'headerispresent on
the requested resource,²¢ÇÒ Theresponse had HTTP status
code404

³öÏÖÕâÖÖÇé¿öµÄÔÒòÈçÏ£º
±¾´ÎajaxÇëÇóÊÇ¡°·Ç¼òµ¥ÇëÇó¡±,ËùÒÔÇëÇóǰ»á·¢ËÍÒ»´ÎÔ¤¼ìÇëÇó(OPTIONS)
·þÎñÆ÷¶Ëºǫ́½Ó¿ÚûÓÐÔÊÐíOPTIONSÇëÇó,µ¼ÖÂÎÞ·¨ÕÒµ½¶ÔÓ¦½Ó¿ÚµØÖ·
½â¾ö·½°¸: ºó¶ËÔÊÐíoptionsÇëÇó
µÚ¶þÖÖÏÖÏó
No'Access-Control-Allow-Origin'headerispresent on
the requested resource,²¢ÇÒ Theresponse had HTTP status
code405

ÕâÖÖÏÖÏóºÍµÚÒ»ÖÖÓÐÇø±ð,ÕâÖÖÇé¿öÏ£¬ºǫ́·½·¨ÔÊÐíOPTIONSÇëÇó,µ«ÊÇһЩÅäÖÃÎļþÖÐ(Èç °²È«ÅäÖÃ),×èÖ¹ÁËOPTIONSÇëÇó,²Å»áµ¼ÖÂÕâ¸öÏÖÏó
½â¾ö·½°¸£ººó¶Ë¹Ø±Õ¶ÔÓ¦µÄ°²È«ÅäÖÃ
µÚÈýÖÖÏÖÏó
No'Access-Control-Allow-Origin'headerispresent on
the requested resource,²¢ÇÒ status200

ÕâÖÖÏÖÏóºÍµÚÒ»Öֺ͵ڶþÖÖÓÐÇø±ð,ÕâÖÖÇé¿öÏ£¬·þÎñÆ÷¶Ëºǫ́ÔÊÐíOPTIONSÇëÇó,²¢ÇÒ½Ó¿ÚÒ²ÔÊÐíOPTIONSÇëÇó,µ«ÊÇÍ·²¿Æ¥Åäʱ³öÏÖ²»Æ¥ÅäÏÖÏó
±ÈÈçoriginÍ·²¿¼ì²é²»Æ¥Åä,±ÈÈçÉÙÁËһЩͷ²¿µÄÖ§³Ö(Èç³£¼ûµÄX-Requested-WithÍ·²¿),È»ºó·þÎñ¶Ë¾Í»á½«response·µ»Ø¸øÇ°¶Ë,ǰ¶Ë¼ì²âµ½Õâ¸öºó¾Í´¥·¢XHR.onerror,µ¼ÖÂǰ¶Ë¿ØÖÆÌ¨±¨´í
½â¾ö·½°¸£ººó¶ËÔö¼Ó¶ÔÓ¦µÄÍ·²¿Ö§³Ö
µÚËÄÖÖÏÖÏó
heade contains multiple values'*,*'


±íÏÖÏÖÏóÊÇ£¬ºǫ́ÏìÓ¦µÄhttpÍ·²¿ÐÅÏ¢ÓÐÁ½¸ö Access-Control-Allow-Origin:*
˵ʵ»°£¬ÕâÖÖÎÊÌâ³öÏÖµÄÖ÷ÒªÔÒò¾ÍÊǽøÐпçÓòÅäÖõÄÈ˲»Á˽âÔÀí£¬µ¼ÖÂÁËÖØ¸´ÅäÖã¬È磺
³£¼ûÓÚ.netºǫ́(Ò»°ãÔÚweb.configÖÐÅäÖÃÁËÒ»´Îorigin,È»ºó´úÂëÖÐÓÖÊÖ¶¯Ìí¼ÓÁËÒ»´Îorigin(±ÈÈç´úÂëÊÖ¶¯ÉèÖÃÁË·µ»Ø*))
³£¼ûÓÚ.netºǫ́(ÔÚIISºÍÏîÄ¿µÄwebconfigÖÐͬʱÉèÖÃOrigin:*)
½â¾ö·½°¸(Ò»Ò»¶ÔÓ¦):
½¨Òéɾ³ý´úÂëÖÐÊÖ¶¯Ìí¼ÓµÄ*£¬Ö»ÓÃÏîÄ¿ÅäÖÃÖеļ´¿É
½¨Òéɾ³ýIISϵÄÅäÖÃ*£¬Ö»ÓÃÏîÄ¿ÅäÖÃÖеļ´¿É
ÈçºÎ½â¾öajax¿çÓò
Ò»°ãajax¿çÓò½â¾ö¾ÍÊÇͨ¹ýJSONP½â¾ö»òÕßCORS½â¾ö,ÈçÒÔÏÂ:(×¢Ò⣬ÏÖÔÚÒѾ¼¸ºõ²»»áÔÙʹÓÃJSONPÁË£¬ËùÒÔJSONPÁ˽âϼ´¿É)
JSONP·½Ê½½â¾ö¿çÓòÎÊÌâ
jsonp½â¾ö¿çÓòÎÊÌâÊÇÒ»¸ö±È½Ï¹ÅÀϵķ½°¸(ʵ¼ÊÖв»ÍƼöʹÓÃ),ÕâÀï×ö¼òµ¥½éÉÜ(ʵ¼ÊÏîÄ¿ÖÐÈç¹ûҪʹÓÃJSONP,Ò»°ã»áʹÓÃJQµÈ¶ÔJSONP½øÐÐÁË·â×°µÄÀà¿âÀ´½øÐÐajaxÇëÇó)
ʵÏÖÔÀí
JSONPÖ®ËùÒÔÄܹ»ÓÃÀ´½â¾ö¿çÓò·½°¸,Ö÷ÒªÊÇÒòΪ <script> ½Å±¾ÓµÓпçÓòÄÜÁ¦,¶øJSONPÕýÊÇÀûÓÃÕâÒ»µãÀ´ÊµÏÖ¡£¾ßÌåÔÀíÈçͼ

ʵÏÖÁ÷³Ì
JSONPµÄʵÏÖ²½Öè´óÖÂÈçÏÂ(²Î¿¼ÁËÀ´Ô´ÖеÄÎÄÕÂ)
¿Í»§¶ËÍøÒ³ÍøÒ³Í¨¹ýÌí¼ÓÒ»¸ö <script> ÔªËØ£¬Ïò·þÎñÆ÷ÇëÇóJSONÊý¾Ý£¬ÕâÖÖ×ö·¨²»ÊÜͬԴÕþ²ßÏÞÖÆ
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(
'response data: '
+ JSON.stringify(data));
}; |
ÇëÇóʱ,½Ó¿ÚµØÖ·ÊÇ×÷Ϊ¹¹½¨³öµÄ½Å±¾±êÇ©µÄsrcµÄ,ÕâÑù,µ±½Å±¾±êÇ©¹¹½¨³öÀ´Ê±,×îÖÕµÄsrcÊǽӿڷµ»ØµÄÄÚÈÝ
·þÎñ¶Ë¶ÔÓ¦µÄ½Ó¿ÚÔÚ·µ»Ø²ÎÊýÍâÃæÌí¼Óº¯Êý°ü¹ü²ã
foo({
"test": "testData"
}); |
ÓÉÓÚ <script> ÔªËØÇëÇóµÄ½Å±¾£¬Ö±½Ó×÷Ϊ´úÂëÔËÐС£Õâʱ£¬Ö»Òªä¯ÀÀÆ÷¶¨ÒåÁËfooº¯Êý£¬¸Ãº¯Êý¾Í»áÁ¢¼´µ÷Óá£×÷Ϊ²ÎÊýµÄJSONÊý¾Ý±»ÊÓΪJavaScript¶ÔÏ󣬶ø²»ÊÇ×Ö·û´®£¬Òò´Ë±ÜÃâÁËʹÓÃJSON.parseµÄ²½Öè¡£
×¢Ò⣺һ°ãµÄJSONP½Ó¿ÚºÍÆÕͨ½Ó¿Ú·µ»ØÊý¾ÝÊÇÓÐÇø±ðµÄ£¬ËùÒÔ½Ó¿ÚÈç¹ûÒª×öJSONO¼æÈÝ£¬ÐèÒª½øÐÐÅжÏÊÇ·ñÓжÔÓ¦callback¹Ø¼ü×Ö²ÎÊý£¬Èç¹ûÓÐÔòÊÇJSONPÇëÇ󣬷µ»ØJSONPÊý¾Ý£¬·ñÔò·µ»ØÆÕͨÊý¾Ý¡£
ʹÓÃ×¢Òâ
»ùÓÚJSONPµÄʵÏÖÔÀí,ËùÒÔJSONPÖ»ÄÜÊÇ¡°GET¡±ÇëÇ󣬲»ÄܽøÐнÏΪ¸´ÔÓµÄPOSTºÍÆäËüÇëÇó£¬ËùÒÔÓöµ½ÄÇÖÖÇé¿ö£¬¾ÍµÃ²Î¿¼ÏÂÃæµÄCORS½â¾ö¿çÓòÁË(ËùÒÔÈç½ñËüÒ²»ù±¾±»ÌÔÌÁË)
CORS½â¾ö¿çÓòÎÊÌâ
CORSµÄÔÀíÉÏÎÄÖÐÒѾ½éÉÜÁË£¬ÕâÀïÖ÷Òª½éÉܵÄÊÇ£¬Êµ¼ÊÏîÄ¿ÖУ¬ºó¶ËÓ¦¸ÃÈçºÎÅäÖÃÒÔ½â¾öÎÊÌâ(ÒòΪ´óÁ¿ÏîĿʵ¼ù¶¼ÊÇÓɺó¶Ë½øÐнâ¾öµÄ)£¬ÕâÀïÕûÀíÁËһЩ³£¼ûµÄºó¶Ë½â¾ö·½°¸:
PHPºǫ́ÅäÖÃ
PHPºǫ́µÃÅäÖü¸ºõÊÇËùÓкǫ́ÖÐ×îΪ¼òµ¥µÄ£¬×ñÑÈçϲ½Öè¼´¿É£º
µÚÒ»²½£ºÅäÖÃPhp ºǫ́ÔÊÐí¿çÓò
<?php
header(
'Access-Control-Allow-Origin: *'
);
header(
'Access-Control-Allow-Headers: Origin, X-Requested-With,
Content-Type, Accept'
);
//Ö÷ҪΪ¿çÓòCORSÅäÖõÄÁ½´ó»ù±¾ÐÅÏ¢,OriginºÍheaders |
µÚ¶þ²½£ºÅäÖÃApache web·þÎñÆ÷¿çÓò(httpd.confÖÐ)
Ôʼ´úÂë
<Directory
/>
AllowOverride none
Require all denied
</Directory> |
¸ÄΪÒÔÏ´úÂë
<Directory
/>
Options FollowSymLinks
AllowOverride none
Order deny,allow
Allow from all
</Directory> |
Node.jsºǫ́ÅäÖÃ(express¿ò¼Ü)
Node.jsµÄºǫ́ҲÏà¶ÔÀ´Ëµ±È½Ï¼òµ¥¾Í¿ÉÒÔ½øÐÐÅäÖá£Ö»ÐèÓÃexpressÈçÏÂÅäÖãº
app.all('*',
function(req, res, next) {
res.header(
"Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers",
"X-Requested-With");
res.header("Access-Control-Allow-Methods",
"PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1')
//Õâ¶Î½ö½öΪÁË·½±ã·µ»Øjson¶øÒÑ
res.header("Content-Type", "application/json;charset=utf-8");
if(req.method == 'OPTIONS') {
//ÈÃoptionsÇëÇó¿ìËÙ·µ»Ø
res.sendStatus(
200
);
}
else
{
next();
}
}); |
JAVAºǫ́ÅäÖÃ
JAVAºǫ́ÅäÖÃÖ»ÐèÒª×ñÑÈçϲ½Öè¼´¿É:
µÚÒ»²½£º»ñÈ¡ÒÀÀµjar°ü
ÏÂÔØ cors-filter-1.7.jar, java-property-utils-1.9.jar
ÕâÁ½¸ö¿âÎļþ·Åµ½libĿ¼Ï¡£(·Åµ½¶ÔÓ¦ÏîÄ¿µÄwebcontent/WEB-INF/lib/ÏÂ)
µÚ¶þ²½£ºÈç¹ûÏîÄ¿ÓÃÁËMaven¹¹½¨µÄ,ÇëÌí¼ÓÈçÏÂÒÀÀµµ½pom.xmlÖÐ:(·ÇmavenÇëºöÊÓ)
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>[ version ]</version>
</dependency> |
ÆäÖа汾Ӧ¸ÃÊÇ×îеÄÎȶ¨°æ±¾,CORS¹ýÂËÆ÷
µÚÈý²½£ºÌí¼ÓCORSÅäÖõ½ÏîÄ¿µÄWeb.xmlÖÐ( App/WEB-INF/web.xml)
<!-- ¿çÓòÅäÖÃ-->
<filter>
<!-- The CORS filter with parameters -->
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<!-- Note: All parameters are options, if omitted
the CORS
Filter will fall back to the respective default
values.
-->
<init-param>
<param-name>cors.allowGenericHttpRequests</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowSubdomains</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>GET, HEAD, POST, OPTIONS</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>Accept, Origin, X-Requested-With,
Content-Type, Last-Modified</param-value>
</init-param>
<init-param>
<param-name>cors.exposedHeaders
</param-name>
<!--ÕâÀï¿ÉÒÔÌí¼ÓһЩ×Ô¼ºµÄ±©Â¶Headers -->
<param-value>X-Test-1, X-Test-2</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.maxAge</param-name>
<param-value>3600</param-value>
</init-param>
</filter>
<filter-mapping>
<!-- CORS Filter mapping -->
<filter-name>
CORS
</filter-name>
<url-pattern>
/*
</url-pattern>
</filter-mapping> |
Çë×¢Òâ,ÒÔÉÏÅäÖÃÎļþÇë·Åµ½web.xmlµÄÇ°Ãæ,×÷ΪµÚÒ»¸öfilter´æÔÚ(¿ÉÒÔÓжà¸öfilterµÄ)
µÚËIJ½£º¿ÉÄܵݲȫģ¿éÅäÖôíÎó(×¢Ò⣬ijЩ¿ò¼ÜÖÐ-Æ©È繫˾˽ÈË¿ò¼Ü£¬Óа²È«Ä£¿éµÄ£¬ÓÐʱºòÕâЩ°²È«Ä£¿éÅäÖûáÓ°Ïì¿çÓòÅäÖã¬Õâʱºò¿ÉÒÔÏȳ¢ÊԹرÕËüÃÇ)
NETºǫ́ÅäÖÃ
.NETºǫ́ÅäÖÿÉÒԲο¼Èçϲ½Ö裺
µÚÒ»²½£ºÍøÕ¾ÅäÖÃ
´ò¿ª¿ØÖÆÃæ°å£¬Ñ¡Ôñ¹ÜÀí¹¤¾ß,Ñ¡Ôñiis;ÓÒ¼üµ¥»÷×Ô¼ºµÄÍøÕ¾£¬Ñ¡Ôñä¯ÀÀ;´ò¿ªÍøÕ¾ËùÔÚĿ¼,ÓüÇʱ¾´ò¿ªweb.configÎļþÌí¼ÓÏÂÊöÅäÖÃÐÅÏ¢,ÖØÆôÍøÕ¾

Çë×¢Òâ,ÒÔÉϽØÍ¼½ÏÀÏ,Èç¹ûÅäÖÃÈÔÈ»³öÎÊÌâ,¿ÉÒÔ¿¼ÂÇÔö¼Ó¸ü¶àµÄheadersÔÊÐí,±ÈÈç:
"Access-Control-Allow-Headers":"X-Requested-With,Content-Type,Accept,Origin"
µÚ¶þ²½£ºÆäËü¸ü¶àÅäÖã¬Èç¹ûµÚÒ»²½½øÐÐÁ˺ó£¬ÈÔÈ»ÓпçÓòÎÊÌ⣬¿ÉÄÜÊÇ
½Ó¿ÚÖÐÓÐÏÞÖÆËÀһЩÇëÇóÀàÐÍ(±ÈÈçдËÀÁËPOSTµÈ)£¬ÕâʱºòÇëÈ¥³ýÏÞ ÖÆ
½Ó¿ÚÖУ¬Öظ´ÅäÖÃÁË Origin:*£¬ÇëÈ¥³ý¼´¿É
IIS·þÎñÆ÷ÖУ¬Öظ´ÅäÖÃÁË Origin:*£¬ÇëÈ¥³ý¼´¿É
´úÀíÇëÇó·½Ê½½â¾ö½Ó¿Ú¿çÓòÎÊÌâ
×¢Ò⣬ÓÉÓÚ½Ó¿Ú´úÀíÊÇÓдú¼ÛµÄ£¬ËùÒÔÕâ¸ö½öÊÇ¿ª·¢¹ý³ÌÖнøÐеġ£
ÓëÇ°ÃæµÄ·½·¨²»Í¬£¬Ç°ÃæCORSÊǺó¶Ë½â¾ö£¬¶øÕâ¸öÖ÷ÒªÊÇǰ¶Ë¶Ô½Ó¿Ú½øÐдúÀí£¬Ò²¾ÍÊÇ:
ǰ¶ËajaxÇëÇóµÄÊDZ¾µØ½Ó¿Ú
±¾µØ½Ó¿Ú½ÓÊÕµ½ÇëÇóºóÏòʵ¼ÊµÄ½Ó¿ÚÇëÇóÊý¾Ý£¬È»ºóÔÙ½«ÐÅÏ¢·µ»Ø¸øÇ°¶Ë
Ò»°ãÓÃnode.js¼´¿É´úÀí
¹ØÓÚÈçºÎʵÏÖ´úÀí£¬ÕâÀï¾Í²»ÖصãÃèÊöÁË£¬·½·¨ºÍ¶à£¬Ò²²»ÄÑ£¬»ù±¾¶¼ÊÇ»ùÓÚnode.jsµÄ¡£
ËÑË÷¹Ø¼ü×Ö node.js, ´úÀíÇëÇó¼´¿ÉÕÒµ½Ò»´óƱµÄ·½°¸¡£
ÈçºÎ·ÖÎöajax¿çÓò
ÉÏÊöÒѾ½éÉÜÁË¿çÓòµÄÔÀíÒÔ¼°ÈçºÎ½â¾ö£¬µ«Êµ¼Ê¹ý³ÌÖУ¬·¢ÏÖÈÔÈ»ÓкܶàÈ˶ÔÕÕ×ÅÀàËÆµÄÎĵµÎÞ·¨½â¾ö¿çÓòÎÊÌ⣬Ö÷ÒªÌåÏÖÔÚ£¬Ç°¶ËÈËÔ±²»ÖªµÀʲôʱºòÊÇ¿çÓòÎÊÌâÔì³ÉµÄ£¬Ê²Ã´Ê±ºò²»ÊÇ£¬Òò´ËÕâÀïÉÔ΢½éÉÜÏÂÈçºÎ·ÖÎöÒ»¸öÇëÇóÊÇ·ñ¿çÓò:
×¥°üÇëÇóÊý¾Ý
µÚÒ»²½µ±È»ÊǵÃÖªµÀÎÒÃǵÄajaxÇëÇó·¢ËÍÁËʲôÊý¾Ý£¬½ÓÊÕÁËʲô£¬×öµ½ÕâÒ»²½²¢²»ÄÑ£¬Ò²²»ÐèÒª fiddlerµÈ¹¤¾ß£¬½ö»ùÓÚ
Chrome¼´¿É
Chromeä¯ÀÀÆ÷´ò¿ª¶ÔÓ¦·¢ÉúajaxµÄÒ³Ãæ£¬ F12´ò¿ª DevTools
·¢ËÍajaxÇëÇó
ÓÒ²àÃæ°å-> NetWork-> XHR£¬È»ºóÕÒµ½¸Õ²ÅµÄajaxÇëÇó£¬µã½øÈ¥
ʾÀýÒ»(Õý³£µÄajaxÇëÇó)

ÉÏÊöÇëÇóÊÇÒ»¸öÕýÈ·µÄÇëÇó£¬ÎªÁË·½±ã£¬ÎÒ°Ñÿһ¸öÍ·ÓòµÄÒâ˼¶¼±íÃ÷ÁË£¬ÎÒÃÇ¿ÉÒÔÇåÎúµÄ¿´µ½£¬½Ó¿Ú·µ»ØµÄÏìӦͷÓòÖУ¬°üÀ¨ÁË
Access-Control-Allow-Headers:
X-Requested-With,Content-Type,Accept
Access-Control-Allow-Methods: Get,Post,Put,OPTIONS
Access-Control-Allow-Origin: * |
ËùÒÔä¯ÀÀÆ÷½ÓÊÕµ½ÏìӦʱ£¬ÅжϵÄÊÇÕýÈ·µÄÇëÇó£¬×ÔÈ»²»»á±¨´í£¬³É¹¦µÄÄõ½ÁËÏìÓ¦Êý¾Ý¡£
ʾÀý¶þ(¿çÓò´íÎóµÄajaxÇëÇó)
ΪÁË·½±ã£¬ÎÒÃÇÈÔÈ»ÄÃÉÏÃæµÄ´íÎó±íÏÖʾÀý¾ÙÀý¡£

Õâ¸öÇëÇóÖУ¬½Ó¿ÚAllowÀïÃæÃ»ÓаüÀ¨ OPTIONS£¬ËùÒÔÇëÇó³öÏÖÁË¿çÓò¡¢

Õâ¸öÇëÇóÖУ¬ Access-Control-Allow-Origin:*³öÏÖÁËÁ½´Î£¬µ¼ÖÂÁË¿çÓòÅäÖÃûÓÐÕýÈ·ÅäÖ㬳öÏÖÁË´íÎó¡£
¸ü¶à¿çÓò´íÎó»ù±¾¶¼ÊÇÀàËÆµÄ£¬¾ÍÊÇÒÔÉÏÈýÑùûÓÐÂú×ã(Headers,Allow,Origin)£¬ÕâÀï²»ÔÙһһ׸Êö¡£
ʾÀýÈý(Óë¿çÓòÎ޹صÄajaxÇëÇó)
µ±È»£¬Ò²²¢²»ÊÇËùÓеÄajaxÇëÇó´íÎó¶¼Óë¿çÓòÓйأ¬ËùÒÔÇë²»Òª»ìÏý£¬±ÈÈçÒÔÏÂ:


±ÈÈçÕâ¸öÇëÇó£¬ËüµÄ¿çÓòÅäÖÃûÓÐÒ»µãÎÊÌ⣬Ëü³ö´í½ö½öÊÇÒòΪrequestµÄ AcceptºÍresponseµÄ
Content-Type²»Æ¥Åä¶øÒÑ¡£
¸ü¶à
»ù±¾É϶¼ÊÇÕâÑùÈ¥·ÖÎöÒ»¸öajaxÇëÇó£¬Í¨¹ý Chrome¾Í¿ÉÒÔÖªµÀÁË·¢ËÍÁËʲôÊý¾Ý£¬ÊÕµ½ÁËʲôÊý¾Ý£¬È»ºóÔÙÒ»Ò»±È¶Ô¾ÍÖªµÀÎÊÌâºÎÔÚÁË¡£
дÔÚ×îºóµÄ»°
¿çÓòÊÇÒ»¸öÀÏÉú³£Ì¸µÄ»°Ìâ£¬ÍøÉÏÒ²ÓдóÁ¿¿çÓòµÄ×ÊÁÏ£¬²¢ÇÒÓв»ÉÙ¾«Æ·(±ÈÈçÈîÒ»·åǰ±²µÄ)£¬µ«ÊÇÉíΪһ¸öǰ¶ËÈËÔ±²»Ó¦¸Ãdz³¢¶øÖ¹£¬¹Ê¶ø²ÅÓÐÁ˱¾ÎÄ¡£ |