Kaip gauti išteklių paskirstymo užklausą (CORS)

Turiu kompiuterį savo vietiniame kompiuteryje (machineA) su dviem interneto serveriais. Pirmasis yra įmontuotas į XBMC (8080 prievadas) ir parodo mūsų biblioteką. Antrasis serveris yra „Python CherryPy“ scenarijus (8081 prievadas), kurį naudoju failų konvertavimui pagal pareikalavimą. Failo konvertavimą inicijuoja AJAX POST užklausa iš puslapio, kurį aptarnauja XBMC serveris.

  • Eikite į http: // machineA: 8080 , kuriame rodoma biblioteka
  • Rodoma biblioteka
  • Naudotojas spusteli nuorodą „konvertuoti“, kuri pateikia šią komandą:

JQuery Ajax užklausa

 $.post('http://machineA:8081', {file_url: 'asfd'}, function(d){console.log(d)}) 
  • Naršyklė pateikia HTTP OPTIONS užklausą su šiomis antraštėmis:

Užklausos antraštė - OPTIONS

 Host: machineA:8081 User-Agent: ... Firefox/4.01 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,**;q=0.8 Accept-> 

Atsakymas į antraštę - OPTIONS (STATUS = 200 OK)

 Content-Length: 0 Access-Control-Allow-Headers: * Access-Control-Max-Age: 1728000 Server: CherryPy/3.2.0 Date: Thu, 21 Apr 2011 22:37:59 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST, GET, OPTIONS Content-Type: text/html;charset=ISO-8859-1 

Užklausos antraštė - POST

 Host: machineA:8081 User-Agent: ... Firefox/4.01 Accept: */* Accept-> 

Atsakymo antraštė yra POST (STATUS = 200 OK)

 Content-Length: 32 Access-Control-Allow-Headers: * Access-Control-Max-Age: 1728000 Server: CherryPy/3.2.0 Date: Thu, 21 Apr 2011 22:37:59 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Methods: POST, GET, OPTIONS Content-Type: application/json 

Negaliu suprasti, kodėl tas pats užklausa veiks iš vienos svetainės, bet ne iš kitos. Tikiuosi, kad kažkas galės nurodyti, kad aš trūksta. Dėkojame už pagalbą!

171
22 апр. nustatė Jamesas balandžio 22 d 2011-04-22 02:01 '11 at 2:01 2011-04-22 02:01
@ 10 atsakymų

Aš pagaliau atėjau į šią nuorodą: CORS POST dirba su paprastu javascript, bet kodėl gi ne su jQuery? „kuris pažymi, kad 1.5.1

  Access-Control-Request-Headers: x-requested-with 

visų CORS prašymų. jQuery 1.5.2. Be to, pagal tą patį klausimą, nustatant serverio atsakymo antraštę

 Access-Control-Allow-Headers: * 

neleidžia tęsti atsakymo. Turite užtikrinti, kad atsakymo antraštėje būtų reikalingos antraštės. t.y.

 Access-Control-Allow-Headers: x-requested-with 
134
22 апр. Atsakymą pateikė Jamesas balandžio 22 d 2011-04-22 10:33 '11 prie 10:33 2011-04-22 10:33

PLEASE:

  $.ajax({ url: "http://localhost:8079/students/add/", type: "POST", crossDomain: true, data: JSON.stringify(somejson), dataType: "json", success: function (response) { var resp = JSON.parse(response) alert(resp.status); }, error: function (xhr, status) { alert("error"); } }); 

ATSAKYMAS:

 response = HttpResponse(json.dumps('{"status" : "success"}')) response.__setitem__("Content-type", "application/json") response.__setitem__("Access-Control-Allow-Origin", "*") return response 
55
06 дек. Atsakymą pateikė Hassan Zaheer. 2013-12-06 15:02 '13, 15:02 2013-12-06 15:02

Atėjo laikas rasti sprendimą.

Jei jūsų serverio atsakymas yra teisingas ir prašymas yra problema, prašyme turėtumėte pridėti su „ withCredentials: true xhrFields :

 $.ajax({ url: url, type: method, // This is the important part xhrFields: { withCredentials: true }, // This is the important part data: data, success: function (response) { // handle the response }, error: function (xhr, status) { // handle errors } }); 

Pastaba: reikalingas jQuery> = 1.5.1

9
02 марта '17 в 14:32 2017-03-02 14:32 atsakymą Dekel pateikė kovo 2 d. 17 d. 14:32 2017-03-02 14:32

Na, aš keletą savaičių kovojau su šia problema.

Paprasčiausias, suderinamiausias ir ne įsilaužėlių būdas tai padaryti yra, jei naudojate paslaugų teikėjo „JavaScript“ teikėją, kuris neskambina naršykle ir gali tvarkyti „Cross Origin“ užklausas.

Pavyzdžiui. „Facebook“ API „JavaScript“ ir „Google JS API“.

Jei jūsų API teikėjas nėra dabartinis ir nepalaiko atsakymo į „Origins Origins“ * antraštę ir neturi JS api (taip, kalbu apie „Yahoo“), jūs patiriate vieną iš trijų variantų -

  • Naudokite jsonp savo užklausose, kuri prideda atgalinio ryšio funkciją į jūsų URL, kur galite tvarkyti savo atsakymą. Atsargiai: Ar tai pakeis užklausos URL, kad jūsų API serveris būtų įrengtas, kad galėtumėte apdoroti atgalines žinutes? URL pabaigoje.

  • Siųskite užklausą į savo serverio API, kuris yra jūsų valdiklis, ir yra tame pačiame domene kaip klientas, arba įgalintas kryžminis šaltinių šaltinis, iš kurio galite perduoti užklausą trečiosios šalies API serveriui.

  • Tikriausiai naudingiausia, kai pateikiate „OAuth“ užklausas ir reikia tvarkyti naudotojo sąveiką. Haha window.open('url',"newwindowname",'_blank', 'toolbar=0,location=0,menubar=0')

8
01 авг. atsakymas pateikiamas Pritam Roy 01 rug. 2015-08-01 16:39 '15 , 16:39 2015-08-01 16:39

Naudojant šį būdą kartu su Laraveliu išsprendžiau mano problemą. Tiesiog pridėkite šią antraštę prie jQuery Access-Control-Request-Headers: x-requested-with request Access-Control-Request-Headers: x-requested-with request ir įsitikinkite, kad jūsų serverio pusės atsakymas turi šį Access-Control-Allow-Headers: * antraštės rinkinį.

3
13 апр. atsakymas pateikiamas MK 13 d. 2014-04-13 05:58 '14 ne 5:58 2014-04-13 05:58

Aš išsprendžiau savo problemą naudodamas „Google“ atstumo API, nustatydamas užklausos antraštę naudodamas „jQuery ajax“. žiūrėkite žemiau.

 var settings = { 'cache': false, 'dataType': "jsonp", "async": true, "crossDomain": true, "url": "https://maps.googleapis.com/maps/api/distancematrix/json?units=metric "method": "GET", "headers": { "accept": "application/json", "Access-Control-Allow-Origin":"*" } } $.ajax(settings).done(function (response) { console.log(response); }); 

Atminkite, kad pridėjau nustatymuose
**

 "headers": { "accept": "application/json", "Access-Control-Allow-Origin":"*" } 

**
Tikiuosi, kad tai padės.

2
13 апр. Atsakyti Miracool balandžio 13 2018-04-13 12:42 '18, 12:42 pm 2018-04-13 12:42

Dėl kokių nors priežasčių klausimas dėl GET užklausų buvo sujungtas, todėl atsakysiu čia.

Ši paprasta funkcija asinchroniškai gauna HTTP būsenos atsakymą iš CORS įjungto puslapio. Jei jį paleisite, pamatysite, kad tik puslapis su atitinkamais antraštėmis grąžina būseną 200, kai jis pasiekiamas per XMLHttpRequest - ar naudojamas GET, ar POST. Nieko negali būti daroma kliento pusėje, kad galėtumėte tai pasiekti, išskyrus galbūt naudojant JSONP, jei jums reikia tik „Json“ objekto.

Toliau pateikta informacija gali būti lengvai pakeista, kad būtų galima gauti duomenis, saugomus xmlHttpRequestObject:

 <html> <head> <title>Check if page is cors</title> </head> <body> <p>A CORS-enabled source has one of the following HTTP headers:</p> <ul> <li>Access-Control-Allow-Headers: *</li> <li>Access-Control-Allow-Headers: x-requested-with</li> </ul> <p>Click a button to see if the page allows CORS</p> <form name="form1" action="" method="get"> <input type="button" name="btn1" value="Check Google Page" onClick="checkCorsSource('google')"> <input type="button" name="btn1" value="Check Cors Page" onClick="checkCorsSource('cors')"> </form> <p id="txt1" /> </body> </html> 
1
15 сент. Atsakymą pateikė Viktoras Stoddardas rugsėjo 15 d. 2017-09-15 00:31 '17 0:31 2017-09-15 00:31

Tai yra tai, kas man veikė, santrauka:

Nustatykite naują funkciją (supaprastinkite $.ajax ):

 jQuery.postCORS = function(url, data, func) { if(func == undefined) func = function(){}; return $.ajax({ type: 'POST', url: url, data: data, dataType: 'json', contentType: 'application/x-www-form-urlencoded', xhrFields: { withCredentials: true }, success: function(res) { func(res) }, error: function() { func({}) } }); } 

Taikymas:

 $.postCORS("https://example.com/service.json",{ x : 1 },function(obj){ if(obj.ok) { ... } }); 

Taip pat veikia su .done , .fail ir kt.

 $.postCORS("https://example.com/service.json",{ x : 1 }).done(function(obj){ if(obj.ok) { ... } }).fail(function(){ alert("Error!"); }); 

Serverio pusėje (šiuo atveju, kai pavyzdys.com yra), įdiekite šias antraštes (pavyzdinis kodas pridėtas PHP):

 header('Access-Control-Allow-Origin: https://not-example.com'); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Max-Age: 604800'); header("Content-type: application/json"); $array = array("ok" => $_POST["x"]); echo json_encode($array); 

Tai vienintelis būdas išsiaiškinti iš JS esančio POST domeno.

JSONP konvertuoja POST į GET, kuris gali rodyti jautrią informaciją serverio žurnaluose.

1
05 авг. atsakymas yra suteiktas lepė 05 rug . 2016-08-05 10:17 '16 at 10:17 2016-08-05 10:17

Turėjau tą pačią problemą, kai džiaugsmo metu man buvo problemos, susijusios su tymų užklausomis el. Paštu, kur prašymai buvo įvykdyti įprastai - buvau pavargęs nuo pirmiau minėtų dalykų be jokių rezultatų. Turėjau teisingus antraštes ant mano serverio ir pan. Perjungimas į XMLHTTPRequest naudojimą vietoj jquery iš karto nustatė mano problemą. Nesvarbu, kokia jquery versija aš naudojosi, ji neištaisė. Perkelti taip pat veikia be problemų, jei jums nereikia suderinamumo su atvirkštine naršykle.

  var xhr = new XMLHttpRequest() xhr.open('POST', 'https://mywebsite.com', true) xhr.withCredentials = true xhr.onreadystatechange = function() { if (xhr.readyState === 2) {// do something} } xhr.setRequestHeader('Content-Type', 'application/json') xhr.send(json) 

Tikiuosi, kad tai padės kitiems, turintiems tas pačias problemas.

1
18 июня '18 в 21:24 2018-06-18 21:24 Atsakymas duotas ozzieisaacs birželio 18 d. 18:24 2018-06-18 21:24

Tai šiek tiek vėlu vakarui, bet aš su juo kovojau porą dienų. Tai įmanoma, ir nė vienas iš čia rastų atsakymų neveikė. Tai yra apgaulingai paprasta. Čia yra skambutis .ajax:

Kiti klausimai apie „ arba „ Klauskite“