JSON

Ç°¶ËͨÐŽø½×(4)

×ÖºÅ+ ×÷ÕߣºH5Ö®¼Ò À´Ô´£ºH5Ö®¼Ò 2016-03-25 17:01 ÎÒÒªÆÀÂÛ( )

ËùÒÔ£¬ÕâÀï°²ÀûһϠNicholas Zakas ´óÉñдµÄÒ»¸öº¯Êý.(ÎÒ°ÑÓ¢ÎĸÄΪÖÐÎÄÁË) function createCORSRequest(method, url) { var xhr = new XMLHttpRequest(); if (withCredentials in xhr) {// ¼ì²éxhrÊÇ·ñº¬ÓÐwithCr

ËùÒÔ£¬ÕâÀï°²ÀûһϠNicholas Zakas ´óÉñдµÄÒ»¸öº¯Êý.(ÎÒ°ÑÓ¢ÎĸÄΪÖÐÎÄÁË)

function createCORSRequest(method, url) { var xhr = new XMLHttpRequest(); if ("withCredentials" in xhr) { // ¼ì²éxhrÊÇ·ñº¬ÓÐwithCredentialsÊôÐÔ //withCredentials Ö»´æÔÚÓÚXHR2¶ÔÏóÖÐ. xhr.open(method, url, true); } else if (typeof XDomainRequest != "undefined") { // ¼ì²éÊÇ·ñÊÇIE£¬²¢ÇÒʹÓÃIEµÄXDomainRequest xhr = new XDomainRequest(); xhr.open(method, url); } else { // ·ñÔò..»ù±¾ÉϾͲ»ÄÜ¿çÓòÁË xhr = null; } return xhr; }

È»ºó, ¾Í¿ÉÒÔÖ±½Ó£¬xhr.send(body). ÄÇCORSÆäʵ¾ÍÍê³ÉÁË.

µ«, withCredentials ÊÇʲôÒâ˼ÄØ?

CORSÖеÄwithCredentials

¸ÃÊôÐÔ¾ÍÊÇÓÃÀ´±íÃ÷£¬ÄãµÄrequestµÄʱºò£¬ÊÇ·ñ´øÉÏÄãµÄcookie. ĬÈÏÇé¿öÏÂÊDz»´øµÄ. Èç¹ûÄãÒª·¢ËÍcookie¸øserverµÄ»°, ¾ÍÐèÒª½«withCredentialsÉèÖÃΪtrueÁË.

xhr.withCredentials = true;

µ«ÊÇ,server²¢²»ÊÇËæ±ã¾ÍÄܽÓÊܲ¢·µ»ØеÄcookie¸øÄãµÄ¡£ ÔÚserver¶Ë,»¹ÐèÒªÉèÖÃ.

Access-Control-Allow-Credentials: true ÕâÑùserver²ÅÄÜ·µ»ØеÄcookie¸øÄã. ²»¹ý£¬Õ⻹ÓÐÒ»¸öÎÊÌâ,¾ÍÊÇcookie»¹ÊÇ×ñÑ­same-origin policyµÄ¡£ ËùÒÔ, ÄãÎÞ·¨Ê¹ÓÃdocument.cookieÈ¥·ÃÎÊËû. ËûµÄCRUD(Ôöɾ²é¸Ä)Ö»ÄÜÓÉ server¿ØÖÆ.

CORS µÄpreflight ÑéÖ¤

CORSµÄpreflight request, Ó¦¸ÃËãÊÇCORSÖÐÀïÃæ ¾Þ¿ÓµÄÒ»¸ö¡£ ÒòΪÔÚʹÓÃCORS µÄʱºò£¬ ÓÐʱºòÎÒÃüÃûÖ»·¢ËÍÒ»´ÎÇëÇ󣬵«ÊÇ,½á¹û³öÀ´ÁËÁ½¸ö¡£ ÓÐʱºòÓÖÖ»ÓÐÒ»¸ö, Õâʱºò, ÎÒ¾ÍÏëÎÊ£¬»¹ÓÐË­Äܲ»ã±Æ.

ÕâÀÎÒÃǾÍÐèÒªÇø·ÖÒ»ÏÂ. preflight requestµÄ×÷Óõ½µ×ÊÇʲô¡£

preflight request ÊÇΪÁË, ¸üºÃ½ÚÊ¡¿í´ø¶øÉè¼ÆµÄ. ÒòΪCORS ÒªÇóµÄÍøÂçÖÊÁ¿¸ü¸ß, ¶øÇÒ »¨·ÑµÄʱ¼äÒ²¸ü¶à. ÍòÒ», Äã·¢ËÍÒ»¸öPUT ÇëÇó(Õâ¸ö²»³£¼û°É). µ«ÊÇ·þÎñ¶ËÓÖ²»Ö§³Ö, ÄÇôÄãÕâ´ÎµÄ ÇëÇóÊÇʧ°ÜÁË£¬ ÀË·Ñ×ÊÔ´»¹²»Ëµ£¬¹Ø¼üÓû§²»ÄÜÈÌѽ~

ËùÒÔ, ÕâÀïÎÒÃǾÍÐèÒªÇø·Ö£¬Ê²Ã´ÊǼòµ¥ÇëÇó, ʲôÊDZȽϸ´ÔÓµÄÇëÇó

¼òµ¥ÇëÇó

¼òµ¥ÇëÇóµÄÄÚÈÝÆäʵ¾ÍÁ½¿é, Ò»¿éÊÇmethod Ò»¿éÊÇHeader

  • Method

  • GET

  • POST

  • Header

  • Accept

  • Accept-Language

  • Content-Language

  • Last-Event-ID //ÕâÊÇSSEµÄÇëÇóÍ·

  • Content-Type ,µ«Ö»ÓÐÒ»ÏÂÍ·²ÅÄÜËã¼òµ¥

  • application/x-www-form-urlencoded

  • multipart/form-data

  • text/plain

  • ±ÈÈç, ÎÒʹÓÃÉÏÃ涨ÒåºÃµÄº¯ÊýcreateCORSRequest. À´·¢ËÍÒ»¸ö¼òµ¥ÇëÇó

    var url = ''; var xhr = createCORSRequest('GET', url); xhr.send();

    ÎÒÃÇÀ´¿´Ò»Ï£¬Ö»·¢ËÍÒ»´Î¼òµ¥ÇëÇóʱ£¬ÇëÇóÍ·ºÍÏàӦͷ¸÷ÊÇʲô.£¨ÌÞ³ýÎ޹صÄHeaders£©

    //Request Headers POST HTTP/1.1 Origin: Host: api.bob.com //Response Headers Access-Control-Allow-Origin: Access-Control-Allow-Credentials: true Access-Control-Expose-Headers: Vary Content-Type: text/html; charset=utf-8

    ÉÏÃæ¾ÍÊÇÒ»¸ö¼òµ¥µÄCORS Í·µÄ½»»¥¡£ ÁíÍ⣬˵Ã÷Ò»¸ö Access-Control-Allow-Origin ,¸ÃÍ·ÊDZز»¿ÉÉÙµÄ.

    ±¾À´ÔÚXHRÖÐ, Ò»°ã¿ÉÒÔͨ¹ýxhr.getResponseHeader()À´»ñÈ¡Ïà¹ØµÄÏàӦͷ¡£ µ«ÊÇ ÔÚCORSÖÐÒ»°ã¿ÉÒÔ»ñµÃÈçϼ¸¸ö¼òµ¥µÄHeader:

  • Cache-Control

  • Content-Language

  • Content-Type

  • Expires

  • ETag

  • Last-Modified

  • Pragma

  • Èç¹ûÄãÏ뱩¶¸ü¶àµÄÍ·¸øÓû§µÄ»°¾Í¿ÉÒÔʹÓÃ, Access-Control-Expose-Headers À´½øÐÐÉèÖÃ. ¶à¸öÖµÓÃ','·Ö¸ô.

    ÄÇ·¢ËÍÁ½´ÎÇëÇóÊÇʲôÇé¿öÄØ?

    ÎÒÃÇÈç¹ûÇëÇóµÄÊý¾ÝÊÇapplication/jsonµÄ»°£¬¾Í»á·¢ËÍÁ½´ÎÇëÇó.

    var url = ''; var xhr = createCORSRequest('POST', url); xhr.setRequestHeader('Content-Type','application/json'); xhr.send();

    µÚÒ»´Î,ÎÒÃÇͨ³£½Ð×öpreflight req. ËûÆäʵ²¢Ã»Óз¢ËÍÈκΠdata¹ýÈ¥. Ö»Êǽ«±¾´ÎÐèÒª·¢Ë͵ÄÇëÇóÍ··¢Ë͹ýÈ¥, ÓÃÀ´ÑéÖ¤¸Ã´ÎCORSÇëÇóÊÇ·ñÓÐЧ.ÉÏÃæµÄÇëÇóÍ·¾ÍÓÐ:

    OPTIONS HTTP/1.1 Origin: Content-Type: application/json Access-Control-Request-Method: POST Access-Control-Request-Headers: Custom-Header Host: api.alice.com Accept-Language: en-US Connection: keep-alive

    Access-Control-Request-Method ¾ÍÊÇÓÃÀ´±íÃ÷,¸Ã´ÎÇëÇóµÄ·½·¨.

    ÇëÇóÄÚûÓÐÈκθ½¼ÓµÄÊý¾Ý.

    Èç¹û¸Ã´Îpreflight req ·þÎñÆ÷¿ÉÒÔ´¦Àí£¬ÄÇô·þÎñÆ÷¾Í»áÕý³£·µ»Ø, Èçϵļ¸¸öÍ·.

    //Response Header <= HTTP/1.1 204 No Content Access-Control-Allow-Methods: GET, POST, PUT, DELETE Access-Control-Max-Age: 86400 Access-Control-Allow-Headers: Custom-Header Access-Control-Allow-Origin: Content-Length: 0

    ˵Ã÷Ò»ÏÂÀïÃæµÄÍ·

  • Access-Control-Allow-Methods: Ö¸Ã÷·þÎñÆ÷Ö§³ÖµÄ·½·¨

  • Access-Control-Max-Age: ±íÃ÷¸Ã´Îpreflight req ×µÄÉú´æÖÜÆÚ

  • Access-Control-Allow-Headers: ÊÇ·ñÖ§³ÖÄã×Ô¶¨ÒåµÄÍ·. ±ÈÈç: Custom-Header

  • ÕâÀÖ÷ÒªÒª¿´Ò»Ï Access-Control-Max-Age . ÕâºÍpreflightÁíÍâÒ»¸ö»úÖÆÓкܴóµÄ¹Øϵ. ÒòΪpreflight ÒѾ­¶à·¢ÁËÒ»´ÎÇëÇó£¬ Èç¹ûÿ´Î·¢ËÍjson¸ñʽµÄajaxµÄ»°£¬ ÄÇÎÒ²»ÊÇÿ´Î¶¼ÐèÒªÑéÖ¤Ò»´ÎÂð£¿

    µ±È»²»ÊÇ. preflight req ÓÐ×Ô¼ºµÄÒ»Ì×»úÖÆ. ͨ¹ýÉèÖÃMax-Age À´±íʾ¸Ã´Îprefilght req µÄÓÐЧʱ¼ä¡£ ÔÚ¸ÃÓÐЧʱ¼äÖ®ÄÚ£¬ ºóÃæÈç¹ûÓÐÆäËû¸´ÔÓajax µÄ¿çÓòÇëÇóµÄ»°£¬¾Í²»ÐèÒª½øÐÐÁ½´Î·¢ËÍÑéÖ¤ÁË.

    ¶øÇÒ£¬µÚ¶þ´ÎµÄÇëÇóÍ·ºÍÏàӦͷ »¹¿ÉÒÔ¼õÉÙ²»ÉÙÖظ´µÄHeader.

    ¡¡

    1.±¾Õ¾×ñÑ­ÐÐÒµ¹æ·¶£¬ÈκÎתÔصĸå¼þ¶¼»áÃ÷È·±ê×¢×÷ÕߺÍÀ´Ô´£»2.±¾Õ¾µÄÔ­´´ÎÄÕ£¬ÇëתÔØʱÎñ±Ø×¢Ã÷ÎÄÕÂ×÷ÕߺÍÀ´Ô´£¬²»×ðÖØÔ­´´µÄÐÐΪÎÒÃǽ«×·¾¿ÔðÈΣ»3.×÷ÕßͶ¸å¿ÉÄܻᾭÎÒÃDZ༭Ð޸Ļò²¹³ä¡£

    Ïà¹ØÎÄÕÂ
    • ÁÄÁÄÇ°¶ËºÍºǫ́µÄÊý¾Ý½»»¥ÓëЭÒé

      ÁÄÁÄÇ°¶ËºÍºǫ́µÄÊý¾Ý½»»¥ÓëЭÒé

      2016-01-03 12:25

    • json´¦Àí×ܽá(Ç°¶ËjsºÍºó¶Ëjava)

      json´¦Àí×ܽá(Ç°¶ËjsºÍºó¶Ëjava)

      2015-11-25 09:22

    • WebÇ°¶Ë ³ÌÐòÔ±Ö®¼ÒÂÛ̳

      WebÇ°¶Ë ³ÌÐòÔ±Ö®¼ÒÂÛ̳

      2015-11-21 11:56

    • jsonÓëjsonpµÄÇø±ð

      jsonÓëjsonpµÄÇø±ð

      2015-11-19 11:29

    ÍøÓѵãÆÀ
    Ô