妿æä»¬åå¦ä¸ä¸ªç½ç«åé fetch 请æ±ï¼å该请æ±å¯è½ä¼å¤±è´¥ã
ä¾å¦ï¼è®©æä»¬å°è¯å http://example.com åé fetch 请æ±ï¼
try {
await fetch('http://example.com');
} catch(err) {
alert(err); // fetch 失败
}
æ£å¦ææï¼è·å失败ã
è¿éçæ ¸å¿æ¦å¿µæ¯ æºï¼originï¼ââ åï¼domainï¼/端å£ï¼portï¼/åè®®ï¼protocolï¼çç»åã
è·¨æºè¯·æ± ââ é£äºåéå°å ¶ä»åï¼å³ä½¿æ¯ååï¼ãåè®®æç«¯å£çè¯·æ± ââ éè¦æ¥èªè¿ç¨ç«¯çç¹æ® headerã
è¿ä¸ªçç¥è¢«ç§°ä¸º âCORSâï¼è·¨æºèµæºå ±äº«ï¼Cross-Origin Resource Sharingï¼ã
为ä»ä¹éè¦ CORSï¼è·¨æºè¯·æ±ç®å²
CORS çå卿¯ä¸ºäºä¿æ¤äºèç½å åé»å®¢æ»å»ã
说ççï¼å¨è¿è¯´ç¹å¿é¢å¤è¯ï¼è®²è®²å®çåå²ã
å¤å¹´æ¥ï¼æ¥èªä¸ä¸ªç½ç«çèæ¬æ æ³è®¿é®å¦ä¸ä¸ªç½ç«çå 容ã
è¿ä¸ªç®åæåçè§åæ¯äºèç½å®å
¨çåºç¡ãä¾å¦ï¼æ¥èª hacker.com çèæ¬æ æ³è®¿é® gmail.com ä¸çç¨æ·é®ç®±ãåºäºè¿æ ·çè§åï¼äººä»¬æå°å¾å®å
¨ã
å¨é£æ¶åï¼JavaScript 并没æä»»ä½ç¹æ®çæ§è¡ç½ç»è¯·æ±çæ¹æ³ãå®åªæ¯ä¸ç§ç¨æ¥è£ 饰ç½é¡µçç©å ·è¯è¨èå·²ã
使¯ Web å¼å人åéè¦æ´å¤åè½ã人们åæäºåç§åæ ·çæå·§å»çªç ´è¯¥éå¶ï¼å¹¶åå ¶ä»ç½ç«ååºè¯·æ±ã
使ç¨è¡¨å
å
¶ä¸ä¸ç§åå
¶ä»æå¡å¨éä¿¡çæ¹æ³æ¯å¨é£éæäº¤ä¸ä¸ª <form>ã人们å°å®æäº¤å° <iframe>ï¼åªæ¯ä¸ºäºåçå¨å½å页é¢ï¼åè¿æ ·ï¼
<!-- 表åç®æ -->
<iframe name="iframe"></iframe>
<!-- 表åå¯ä»¥ç± JavaScript 卿çæå¹¶æäº¤ -->
<form target="iframe" method="POST" action="http://another.com/â¦">
...
</form>
å æ¤ï¼å³ä½¿æ²¡æç½ç»æ¹æ³ï¼ä¹å¯ä»¥åå
¶ä»ç½ç«ååº GET/POST 请æ±ï¼å 为表åå¯ä»¥å°æ°æ®åéå°ä»»ä½å°æ¹ã使¯ç±äºç¦æ¢ä»å
¶ä»ç½ç«è®¿é® <iframe> ä¸çå
容ï¼å æ¤å°±æ æ³è¯»åååºã
ç¡®åå°è¯´ï¼å®é 䏿ä¸äºæå·§è½å¤è§£å³è¿ä¸ªé®é¢ï¼è¿å¨ iframe å页é¢ä¸é½éè¦æ·»å ç¹æ®èæ¬ãå æ¤ï¼ä¸ iframe çéä¿¡å¨ææ¯ä¸æ¯å¯è½çãç°å¨æä»¬æ²¡å¿ è¦è®²å ¶ç»èå å®¹ï¼æä»¬è¿æ¯è®©è¿äºå¤è£ä»£ç ä¸è¦ååºç°äºå§ã
ä½¿ç¨ script
å¦ä¸ä¸ªæå·§æ¯ä½¿ç¨ script æ ç¾ãscript å¯ä»¥å
·æä»»ä½åç srcï¼ä¾å¦ <script src="http://another.com/â¦">ãä¹å¯ä»¥æ§è¡æ¥èªä»»ä½ç½ç«ç scriptã
妿ä¸ä¸ªç½ç«ï¼ä¾å¦ another.com è¯å¾å
¬å¼è¿ç§è®¿é®æ¹å¼çæ°æ®ï¼åä¼ä½¿ç¨æè°ç âJSONP (JSON with padding)â åè®®ã
è¿æ¯å®ç工使¹å¼ã
åè®¾å¨æä»¬çç½ç«ï¼éè¦ä»¥è¿ç§æ¹å¼ä» http://another.com ç½ç«è·åæ°æ®ï¼ä¾å¦å¤©æ°ï¼
-
é¦å ï¼æä»¬å 声æä¸ä¸ªå ¨å±å½æ°æ¥æ¥æ¶æ°æ®ï¼ä¾å¦
gotWeatherã// 1. 声æå¤çå¤©æ°æ°æ®ç彿° function gotWeather({ temperature, humidity }) { alert(`temperature: ${temperature}, humidity: ${humidity}`); } -
ç¶åæä»¬å建ä¸ä¸ªç¹æ§ï¼attributeï¼ä¸º
src="http://another.com/weather.json?callback=gotWeather"ç<script>æ ç¾ï¼ä½¿ç¨æä»¬ç彿°åä½ä¸ºå®çcallbackURL-åæ°ãlet script = document.createElement('script'); script.src = `http://another.com/weather.json?callback=gotWeather`; document.body.append(script); -
è¿ç¨æå¡å¨
another.com卿çæä¸ä¸ªèæ¬ï¼è¯¥èæ¬è°ç¨gotWeather(...)ï¼åé宿³è®©æä»¬æ¥æ¶çæ°æ®ã// æä»¬æææ¥èªæå¡å¨çåççèµ·æ¥åè¿æ ·ï¼ gotWeather({ temperature: 25, humidity: 78 }); -
å½è¿ç¨èæ¬å 载并æ§è¡æ¶ï¼
gotWeather彿°å°è¿è¡ï¼å¹¶ä¸å ä¸ºå®æ¯æä»¬ç彿°ï¼æä»¬å°±æäºéè¦çæ°æ®ã
è¿æ¯å¯è¡çï¼å¹¶ä¸ä¸è¿åå®å ¨è§å®ï¼å ä¸ºåæ¹é½åæä»¥è¿ç§æ¹å¼ä¼ éæ°æ®ãèä¸ï¼æ¢ç¶åæ¹é½åæè¿ç§è¡ä¸ºï¼é£è¿è¯å®ä¸æ¯é»å®¢æ»å»äºãç°å¨ä»ç¶ææä¾è¿ç§è®¿é®çæå¡ï¼å 为å³ä½¿æ¯é常æ§çæµè§å¨å®ä¾ç¶éç¨ã
ä¸ä¹ ä¹åï¼ç½ç»æ¹æ³åºç°å¨äºæµè§å¨ JavaScript ä¸ã
èµ·åï¼è·¨æºè¯·æ±æ¯è¢«ç¦æ¢çã使¯ï¼ç»è¿é¿æ¶é´ç讨论ï¼è·¨æºè¯·æ±è¢«å 许äºï¼ä½æ¯ä»»ä½æ°åè½é½éè¦æå¡å¨æç¡®å 许ï¼ä»¥ç¹æ®ç header 表述ã
å®å ¨è¯·æ±
æä¸¤ç§ç±»åçè·¨æºè¯·æ±ï¼
- å®å ¨è¯·æ±ã
- ææå ¶ä»è¯·æ±ã
å®å ¨è¯·æ±å¾ç®åï¼æä»¥æä»¬å ä»å®å¼å§ã
妿ä¸ä¸ªè¯·æ±æ»¡è¶³ä¸é¢è¿ä¸¤ä¸ªæ¡ä»¶ï¼åè¯¥è¯·æ±æ¯å®å ¨çï¼
- å®å ¨çæ¹æ³ï¼GETï¼POST æ HEAD
- å®å
¨ç header ââ ä»
å
许èªå®ä¹ä¸å headerï¼
Acceptï¼Accept-Languageï¼Content-Languageï¼Content-Typeçå¼ä¸ºapplication/x-www-form-urlencodedï¼multipart/form-dataætext/plainã
ä»»ä½å
¶ä»è¯·æ±é½è¢«è®¤ä¸ºæ¯âéå®å
¨â请æ±ãä¾å¦ï¼å
·æ PUT æ¹æ³æ API-Key HTTP-header ç请æ±å°±ä¸æ¯å®å
¨è¯·æ±ã
æ¬è´¨åºå«å¨äºï¼å¯ä»¥ä½¿ç¨ <form> æ <script> è¿è¡å®å
¨è¯·æ±ï¼èæ éä»»ä½å
¶ä»ç¹æ®æ¹æ³ã
å æ¤ï¼å³ä½¿æ¯é常æ§çæå¡å¨ä¹è½å¾å¥½å°æ¥æ¶å®å ¨è¯·æ±ã
䏿¤ç¸åï¼å¸¦æéæ å header æè
ä¾å¦ DELETE æ¹æ³ç请æ±ï¼æ æ³éè¿è¿ç§æ¹å¼å建ãå¨å¾é¿ä¸æ®µæ¶é´éï¼JavaScript é½ä¸è½è¿è¡è¿æ ·ç请æ±ãæä»¥ï¼æ§çæå¡å¨å¯è½ä¼è®¤ä¸ºæ¤ç±»è¯·æ±æ¥èªå
·æç¹æçæ¥æºï¼privileged sourceï¼ï¼âå 为ç½é¡µæ æ³åéå®ä»¬âã
彿们å°è¯åéä¸ä¸ªéå®å ¨è¯·æ±æ¶ï¼æµè§å¨ä¼åéä¸ä¸ªç¹æ®çâ颿£ï¼preflightï¼â请æ±å°æå¡å¨ ââ è¯¢é®æå¡å¨ï¼ä½ æ¥åæ¤ç±»è·¨æºè¯·æ±åï¼
å¹¶ä¸ï¼é¤éæå¡å¨æç¡®éè¿ header è¿è¡ç¡®è®¤ï¼å¦åéå®å ¨è¯·æ±ä¸ä¼è¢«åéã
ç°å¨ï¼æä»¬æ¥è¯¦ç»ä»ç»å®ä»¬ã
ç¨äºå®å ¨è¯·æ±ç CORS
妿ä¸ä¸ªè¯·æ±æ¯è·¨æºçï¼æµè§å¨å§ç»ä¼åå
¶æ·»å Origin headerã
ä¾å¦ï¼å¦ææä»¬ä» https://javascript.info/page è¯·æ± https://anywhere.com/requestï¼è¯·æ±ç header å°å¦ä¸æç¤ºï¼
GET /request
Host: anywhere.com
Origin: https://javascript.info
...
æ£å¦ä½ æçå°çï¼Origin å
å«äºç¡®åçæºï¼domain/protocol/portï¼ï¼æ²¡æè·¯å¾ï¼pathï¼ã
æå¡å¨å¯ä»¥æ£æ¥ Originï¼å¦æåææ¥åè¿æ ·ç请æ±ï¼å°±ä¼å¨ååºä¸æ·»å ä¸ä¸ªç¹æ®ç header Access-Control-Allow-Originã该 header å
å«äºå
è®¸çæºï¼å¨æä»¬ç示ä¾ä¸æ¯ https://javascript.infoï¼ï¼æè
ä¸ä¸ªæå· *ãç¶åååºæåï¼å¦åæ¥éã
æµè§å¨å¨è¿éæ®æ¼å被信任çä¸é´äººçè§è²ï¼
- å®ç¡®ä¿åéçè·¨æºè¯·æ±å¸¦ææ£ç¡®ç
Originã - 宿£æ¥ååºä¸ç许å¯
Access-Control-Allow-Originï¼å¦æåå¨ï¼åå 许 JavaScript 访é®ååºï¼å¦åå°å¤±è´¥å¹¶æ¥éã
è¿æ¯ä¸ä¸ªå¸¦ææå¡å¨è®¸å¯çååºç¤ºä¾ï¼
200 OK
Content-Type:text/html; charset=UTF-8
Access-Control-Allow-Origin: https://javascript.info
Response header
对äºè·¨æºè¯·æ±ï¼é»è®¤æ åµä¸ï¼JavaScript åªè½è®¿é®âå®å ¨çâ response headerï¼
Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma
访é®ä»»ä½å ¶ä» response header é½å°å¯¼è´ errorã
请注æï¼åè¡¨ä¸æ²¡æ Content-Length headerï¼
该 header å å«å®æ´çååºé¿åº¦ãå æ¤ï¼å¦ææä»¬æ£å¨ä¸è½½æäºå 容ï¼å¹¶å¸æè·è¸ªè¿åº¦ç¾åæ¯ï¼åéè¦é¢å¤çæéæè½è®¿é®è¯¥ headerï¼è¯·è§ä¸æï¼ã
è¦æäº JavaScript 对任ä½å
¶ä» response header çè®¿é®æéï¼æå¡å¨å¿
é¡»åé Access-Control-Expose-Headers headerãå®å
å«ä¸ä¸ªä»¥éå·åéçåºè¯¥è¢«è®¾ç½®ä¸ºå¯è®¿é®çéå®å
¨ header åç§°å表ã
ä¾å¦ï¼
200 OK
Content-Type:text/html; charset=UTF-8
Content-Length: 12345
API-Key: 2c9de507f2c54aa1
Access-Control-Allow-Origin: https://javascript.info
Access-Control-Expose-Headers: Content-Length,API-Key
æäºè¿ç§ Access-Control-Expose-Headers headerï¼æ¤èæ¬å°±è¢«å
许读åååºç Content-Length å API-Key headerã
âéå®å ¨â请æ±
æä»¬å¯ä»¥ä½¿ç¨ä»»ä½ HTTP æ¹æ³ï¼ä¸ä»
ä»
æ¯ GET/POSTï¼ä¹å¯ä»¥æ¯ PATCHï¼DELETE åå
¶ä»ã
ä¹åï¼æ²¡æäººè½å¤è®¾æ³ç½é¡µè½ååºè¿æ ·ç请æ±ãå æ¤ï¼å¯è½ä»ç¶åå¨æäº Web æå¡å°éæ åæ¹æ³è§ä¸ºä¸ä¸ªä¿¡å·ï¼âè¿ä¸æ¯æµè§å¨âãå®ä»¬å¯ä»¥å¨æ£æ¥è®¿é®æéæ¶å°å ¶èèå¨å ã
å æ¤ï¼ä¸ºäºé¿å 误解ï¼ä»»ä½âéå®å ¨âè¯·æ± ââ å¨è¿å»æ æ³å®æçï¼æµè§å¨ä¸ä¼ç«å³ååºæ¤ç±»è¯·æ±ãé¦å ï¼å®ä¼å åéä¸ä¸ªåæ¥çãæè°çâ颿£ï¼preflightï¼â请æ±ï¼æ¥è¯·æ±è®¸å¯ã
颿£è¯·æ±ä½¿ç¨ OPTIONS æ¹æ³ï¼å®æ²¡æ bodyï¼ä½æ¯æä¸ä¸ª headerï¼
Access-Control-Request-Methodheader 带æéå®å ¨è¯·æ±çæ¹æ³ãAccess-Control-Request-Headersheader æä¾ä¸ä¸ªä»¥éå·åéçéå®å ¨ HTTP-header å表ãOriginheader 说æè¯·æ±æ¥èªåªéãï¼å¦ https://javascript.infoï¼
妿æå¡å¨åæå¤ç请æ±ï¼é£ä¹å®ä¼è¿è¡ååºï¼æ¤ååºçç¶æç åºè¯¥ä¸º 200ï¼æ²¡æ bodyï¼å ·æ headerï¼
Access-Control-Allow-Originå¿ é¡»ä¸º*æè¿è¡è¯·æ±çæºï¼ä¾å¦https://javascript.infoï¼æè½å 许æ¤è¯·æ±ãAccess-Control-Allow-Methodså¿ é¡»å ·æå è®¸çæ¹æ³ãAccess-Control-Allow-Headerså¿ é¡»å ·æä¸ä¸ªå 许ç header å表ã- å¦å¤ï¼header
Access-Control-Max-Ageå¯ä»¥æå®ç¼åæ¤æéçç§æ°ãå æ¤ï¼æµè§å¨ä¸æ¯å¿ 须为满足ç»å®æéçåç»è¯·æ±åé颿£ã
让æä»¬å¨ä¸ä¸ªè·¨æº PATCH 请æ±çä¾åä¸ä¸æ¥ä¸æ¥å°ç宿¯å¦ä½å·¥ä½çï¼æ¤æ¹æ³ç»å¸¸è¢«ç¨äºæ´æ°æ°æ®ï¼ï¼
let response = await fetch('https://site.com/service.json', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
'API-Key': 'secret'
}
});
è¿éæä¸ä¸ªçç±è§£é为ä»ä¹å®ä¸æ¯ä¸ä¸ªå®å ¨è¯·æ±ï¼å ¶å®ä¸ä¸ªå°±å¤äºï¼ï¼
- æ¹æ³
PATCH Content-Type䏿¯è¿ä¸ä¸ªä¸ä¹ä¸ï¼application/x-www-form-urlencodedï¼multipart/form-dataï¼text/plainã- âéå®å
¨â
API-Keyheaderã
Step 1 颿£è¯·æ±ï¼preflight requestï¼
å¨åéæä»¬ç请æ±åï¼æµè§å¨ä¼èªå·±åéå¦ä¸æç¤ºç颿£è¯·æ±ï¼
OPTIONS /service.json
Host: site.com
Origin: https://javascript.info
Access-Control-Request-Method: PATCH
Access-Control-Request-Headers: Content-Type,API-Key
- æ¹æ³ï¼
OPTIONSã - è·¯å¾ ââ ä¸ä¸»è¯·æ±å®å
¨ç¸åï¼
/service.jsonã - ç¹æ®è·¨æºå¤´ï¼
Originââ æ¥æºãAccess-Control-Request-Methodââ è¯·æ±æ¹æ³ãAccess-Control-Request-Headersââ 以éå·åéçâéå®å ¨â header å表ã
Step 2 颿£ååºï¼preflight responseï¼
æå¡åºååºç¶æ 200 å headerï¼
Access-Control-Allow-Origin: https://javascript.infoAccess-Control-Allow-Methods: PATCHAccess-Control-Allow-Headers: Content-Type,API-Keyã
è¿å°å 许åç»éä¿¡ï¼å¦åä¼è§¦åé误ã
妿æå¡å¨å°æ¥éè¦å ¶ä»æ¹æ³å headerï¼åå¯ä»¥éè¿å°è¿äºæ¹æ³å header æ·»å å°åè¡¨ä¸æ¥é¢å å 许å®ä»¬ã
ä¾å¦ï¼æ¤ååºè¿å
许 PUTãDELETE 以åå
¶ä» headerï¼
200 OK
Access-Control-Allow-Origin: https://javascript.info
Access-Control-Allow-Methods: PUT,PATCH,DELETE
Access-Control-Allow-Headers: API-Key,Content-Type,If-Modified-Since,Cache-Control
Access-Control-Max-Age: 86400
ç°å¨ï¼æµè§å¨å¯ä»¥çå° PATCH å¨ Access-Control-Allow-Methods ä¸ï¼Content-Type,API-Key å¨å表 Access-Control-Allow-Headers ä¸ï¼å æ¤å®å°åé主请æ±ã
妿 Access-Control-Max-Age 带æä¸ä¸ªè¡¨ç¤ºç§çæ°åï¼åå¨ç»å®çæ¶é´å
ï¼é¢æ£æéä¼è¢«ç¼åãä¸é¢çååºå°è¢«ç¼å 86400 ç§ï¼ä¹å°±æ¯ä¸å¤©ã卿¤æ¶é´èå´å
ï¼åç»è¯·æ±å°ä¸ä¼è§¦å颿£ãå设å®ä»¬ç¬¦åç¼åçé
é¢ï¼åå°ç´æ¥åéå®ä»¬ã
Step 3 å®é 请æ±ï¼actual requestï¼
颿£æååï¼æµè§å¨ç°å¨ååºä¸»è¯·æ±ãè¿éçè¿ç¨ä¸å®å ¨è¯·æ±çè¿ç¨ç¸åã
主请æ±å
·æ Origin headerï¼å ä¸ºå®æ¯è·¨æºçï¼ï¼
PATCH /service.json
Host: site.com
Content-Type: application/json
API-Key: secret
Origin: https://javascript.info
Step 4 å®é ååºï¼actual responseï¼
æå¡å¨ä¸åºè¯¥å¿è®°å¨ä¸»ååºä¸æ·»å Access-Control-Allow-Originãæåç颿£å¹¶ä¸è½å
餿¤è¦æ±ï¼
Access-Control-Allow-Origin: https://javascript.info
ç¶åï¼JavaScript å¯ä»¥è¯»å主æå¡å¨ååºäºã
颿£è¯·æ±åçå¨âå¹åâï¼å®å¯¹ JavaScript ä¸å¯è§ã
JavaScript ä» è·å对主请æ±çååºï¼å¦ææ²¡ææå¡å¨è®¸å¯ï¼åè·å¾ä¸ä¸ª errorã
åæ®ï¼Credentialsï¼
é»è®¤æ åµä¸ï¼ç± JavaScript 代ç åèµ·çè·¨æºè¯·æ±ä¸ä¼å¸¦æ¥ä»»ä½åæ®ï¼cookies æè HTTP 认è¯ï¼HTTP authenticationï¼ï¼ã
è¿å¯¹äº HTTP è¯·æ±æ¥è¯´å¹¶ä¸å¸¸è§ãé常ï¼å¯¹ http://site.com ç请æ±é带æè¯¥åçææ cookieã使¯ç± JavaScript æ¹æ³ååºçè·¨æºè¯·æ±æ¯ä¸ªä¾å¤ã
ä¾å¦ï¼fetch('http://another.com') ä¸ä¼åéä»»ä½ cookieï¼å³ä½¿é£äº (!) å±äº another.com åç cookieã
为ä»ä¹ï¼
è¿æ¯å ä¸ºå ·æåæ®çè¯·æ±æ¯æ²¡æåæ®ç请æ±è¦å¼ºå¤§å¾å¤ãå¦æè¢«å 许ï¼å®ä¼ä½¿ç¨å®ä»¬çåæ®æäº JavaScript ä»£è¡¨ç¨æ·è¡ä¸ºåè®¿é®ææä¿¡æ¯çå ¨é¨æåã
æå¡å¨ççè¿ä¹ä¿¡ä»»è¿ç§èæ¬åï¼æ¯çï¼å®å¿ é¡»æ¾å¼å°å¸¦æå 许请æ±çåæ®åéå headerã
è¦å¨ fetch ä¸åéåæ®ï¼æä»¬éè¦æ·»å credentials: "include" é项ï¼åè¿æ ·ï¼
fetch('http://another.com', {
credentials: "include"
});
ç°å¨ï¼fetch å°ææºèª another.com ç cookie åæä»¬ç请æ±åéå°è¯¥ç½ç«ã
妿æå¡å¨åææ¥å 带æåæ® ç请æ±ï¼åé¤äº Access-Control-Allow-Origin å¤ï¼æå¡å¨è¿åºè¯¥å¨ååºä¸æ·»å header Access-Control-Allow-Credentials: trueã
ä¾å¦ï¼
200 OK
Access-Control-Allow-Origin: https://javascript.info
Access-Control-Allow-Credentials: true
请注æï¼å¯¹äºå
·æåæ®ç请æ±ï¼ç¦æ¢ Access-Control-Allow-Origin ä½¿ç¨æå· *ãå¦ä¸æç¤ºï¼å®å¿
é¡»æä¸ä¸ªç¡®åçæºãè¿æ¯å¦ä¸é¡¹å®å
¨æªæ½ï¼ä»¥ç¡®ä¿æå¡å¨ççç¥éå®ä¿¡ä»»çååºæ¤è¯·æ±çæ¯è°ã
æ»ç»
仿µè§å¨è§åº¦æ¥çï¼æä¸¤ç§è·¨æºè¯·æ±ï¼âå®å ¨â请æ±åå ¶ä»è¯·æ±ã
âå®å ¨â请æ±å¿ é¡»æ»¡è¶³ä»¥ä¸æ¡ä»¶ï¼
- æ¹æ³ï¼GETï¼POST æ HEADã
- header ââ æä»¬ä»
è½è®¾ç½®ï¼
AcceptAccept-LanguageContent-LanguageContent-Typeçå¼ä¸ºapplication/x-www-form-urlencodedï¼multipart/form-dataætext/plainã
å®å
¨è¯·æ±åå
¶ä»è¯·æ±çæ¬è´¨åºå«å¨äºï¼èªå¤ä»¥æ¥å°±å¯ä»¥ä½¿ç¨ <form> æ <script> æ ç¾æ¥å®ç°å®å
¨è¯·æ±ï¼èå¯¹äºæµè§å¨æ¥è¯´ï¼éå®å
¨è¯·æ±å¨å¾é¿ä¸æ®µæ¶é´é½æ¯ä¸å¯è½çã
æä»¥ï¼å®é
åºå«å¨äºï¼å®å
¨è¯·æ±ä¼ç«å³åéï¼å¹¶å¸¦æ Origin headerï¼è对äºå
¶ä»è¯·æ±ï¼æµè§å¨ä¼ååºåæ¥çâ颿£â请æ±ï¼ä»¥è¯·æ±è®¸å¯ã
对äºå®å ¨è¯·æ±ï¼
- â æµè§å¨åéå¸¦ææºç
Originheaderã - â å¯¹äºæ²¡æåæ®ç请æ±ï¼é»è®¤ä¸åéï¼ï¼æå¡å¨åºè¯¥è®¾ç½®ï¼
Access-Control-Allow-Origin为*æä¸Originçå¼ç¸å
- â 对äºå
·æåæ®ç请æ±ï¼æå¡å¨åºè¯¥è®¾ç½®ï¼
Access-Control-Allow-Originå¼ä¸Originçç¸åAccess-Control-Allow-Credentials为true
æ¤å¤ï¼è¦æäº JavaScript 访é®é¤ Cache-Controlï¼Content-Languageï¼Content-Typeï¼Expiresï¼Last-Modified æ Pragma å¤çä»»ä½ response header çæéï¼æå¡å¨åºè¯¥å¨ header Access-Control-Expose-Headers ä¸ååºå
许çé£äº headerã
对äºéå®å ¨è¯·æ±ï¼ä¼å¨è¯·æ±ä¹åååºåæ¥â颿£â请æ±ï¼
- â æµè§å¨å°å
·æä»¥ä¸ header ç
OPTIONS请æ±åéå°ç¸åç URLï¼Access-Control-Request-Methodæè¯·æ±æ¹æ³ãAccess-Control-Request-Headers以éå·åéçâéå®å ¨â header å表ã
- â æå¡å¨åºè¯¥ååºç¶æç 为 200 å headerï¼
Access-Control-Allow-Methods带æå è®¸çæ¹æ³çå表ï¼Access-Control-Allow-Headers带æå 许ç header çå表ï¼Access-Control-Max-Age带ææå®ç¼åæéçç§æ°ã
- ç¶åï¼åéå®é ç请æ±ï¼å¹¶åºç¨ä¹åçâå®å ¨âæ¹æ¡ã

è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼