Kodėl matau, kad šaltinis nėra išspręstas naudojant „Access-Control-Allow-Origin“ klaidą?

Matau šią klaidą:

 Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin 

naudojant šį kodą:

 var http = new getXMLHttpRequestObject(); var url = "http://gdata.youtube.com/action/GetUploadToken"; var sendXML = '<?xml version="1.0"?><entry xmlns="http://www.w3.org/2005/Atom"'+ 'xmlns:media="http://search.yahoo.com/mrss/'+ 'xmlns:yt="http://gdata.youtube.com/schemas/2007">'+ '<media:group><media:title type="plain">My First API</media:title>'+ '<media:description type="plain">First API</media:description>'+ '<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>'+ '<media:keywords>first, api</media:keywords></media:group></entry>'; http.open("POST", url, true); http.setRequestHeader("Authorization", "AuthSub token=" + AccessToken); http.setRequestHeader("X-GData-Key", "key="+ dev_key); http.setRequestHeader("Content-Type", "application/atom+xml; charset=UTF-8"); http.onreadystatechange = function() { if(http.readyState == 4) { alert(http.responseXML); } } http.send(sendXML); 

Kas tai gali sukelti ir kaip ją išspręsti?

149
16 февр. nustatė Muhammad Usman , vasario 16 d. 2012-02-16 14:01 '12 at 2:01 pm 2012-02-16 14:01
@ 11 atsakymų

„Javascript“ yra apribota, kai vykdomi „ajax“ prašymai už dabartinio domeno ribų.

  • 1 pavyzdys: jūsų domeno „com.com“ domenas ir norite pateikti užklausą test.com => negalite.
  • 2 pavyzdys: jūsų domeno.com domenas ir norite pateikti užklausą dėl vidinio pavyzdžio.com => negalite.
  • 3 pavyzdys: jūsų domeno pavyzdys.lt:80 ir norite užklausą example.com:81 => jūs negalite
  • 4-asis pavyzdys: jūsų domeno „com.com.com“ domenas ir norite užklausą example.com => galite.

Saugumo sumetimais „Javascript“ yra apribota „ta pačia kilmės politika“, kad kenksmingas scenarijus negali susisiekti su nuotoliniu serveriu ir siųsti konfidencialius duomenis.

jsonp yra dar vienas būdas naudoti JavaScript. Jūs pateikiate užklausą, o rezultatai yra įterpti į atgalinio ryšio funkciją, kuri veikia klientui. Tai yra tas pats, kaip susieti naują scenarijų žymą su jūsų html galvute (žinote, kad galite atsisiųsti scenarijus iš skirtingų domenų, išskyrus čia).
Tačiau, norint naudoti jsonp, serveris turi būti teisingai sukonfigūruotas. Jei taip nėra, jūs negalite naudoti „jsonp“, ir jūs privalote pasikliauti serverio pusės proxy serveriu (PHP, ASP ir tt). Yra daug pamokų, susijusių su šia tema, tik „Google“!

169
16 февр. atsakymas suteiktas andreapier 16 vasaris 2012-02-16 15:51 '12 at 15:51 2012-02-16 15:51

XMLHttpRequest neleis pasiekti „ localhost:8080 dėl „tos pačios kilmės politikos“.

Galite leisti šiuolaikinių naršyklių užklausas pridedant antraštę prie atsakymo į „ localhost:8080 :

 Access-Control-Allow-Origin: * 
border=0

Tai galite padaryti pridedant direktyvas prie savo HTTP serverio arba pridedant antraštes per serverio kodą (PHP, Ruby, ...).

Sužinokite daugiau apie „Ajax“ užklausas dėl kryžminio kilmės, apsilankę https://developer.mozilla.org/en/http_access_control

88
17 февр. atsakymas pateikiamas „ Sunny“ 17 vasario mėn. 2012-02-17 14:34 '12 at 14:34 2012-02-17 14:34

Jei naudojate „Chrome“, paprastas sprendimas (tik vystymo tikslais) yra parinktis --disable-web-security .

37
20 июля '12 в 5:36 2012-07-20 05:36 atsakymas duotas Deqingui liepos 12 d., 12 val

Į savo sprendimą pridėkite global.asax sprendimą.

Pridėti

 HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 

į

 protected void Application_BeginRequest(object sender, EventArgs e) { } 
10
14 дек. Atsakymas duotas Ammar Khan gruodžio 14 d. 2012-12-14 14:52 '12 at 2:52 pm 2012-12-14 14:52

Jei naudojate apache, jis veikia: įdėkite / sukurkite .htaccess failą savo viešojoje šaknėje ir pridėkite kitus galimus failų plėtinius.

 <FilesMatch "\.(ttf|otf|eot|woff|jpg|png|jpeg|gif|js|json|html|css)$"> <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*" </IfModule> </FilesMatch> 
9
08 нояб. Atsakymą pateikė Eric Leroy . 2013-11-08 08:50 '13, 8:50, 2013-11-08 08:50

Vietos plėtrai galite naudoti įrankį HTTP atsakymų antraštėms modifikuoti. Pavyzdžiui, Charlesas gali tai padaryti naudodamas įtrauktą perrašymo įrankį: „ Rewrite Tool“

Tiesiog pridėkite naują taisyklę taikomam domenui / vietovei:

 Type: Add Header Where: Response Replace Name: Access-Control-Allow-Origin Value: * Replace All 
7
19 июля '13 в 17:14 2013-07-19 17:14 Atsakymą pateikė Christian Müller , liepos 19 d. 13 val. 17:14 2013-07-19 17:14

Čia mes turime padaryti du dalykus Apache Http

1) Pašalinkite šį failą httpd.config

 LoadModule headers_module modules/mod_headers.so 

2) Pridėti šią eilutę.

 Header set Access-Control-Allow-Origin "*" 
4
02 мая '16 в 18:11 2016-05-02 18:11 Atsakymą pateikė Sireesh Yarlagadda gegužės 2 d. 16 d. 18:11 2016-05-02 18:11

Jei naudojate „Google Chrome“ kaip naršyklę, galite pridėti CORS plėtinį ir jį suaktyvinti, išspręs skylės problemą nekeičiant kodo.

3
17 дек. Atsakymas duotas Meriam gruodžio 17 d. 2014-12-17 18:48 '14, 18:48, 2014-12-17 18:48

Nesusijęs su šiuo konkrečiu klausimu, bet visiems, kurie šioje situacijoje naudojasi jQuery ... Ši klaida taip pat atsiranda, jei bandote atlikti JSONP užklausą naudojant jQuery ir praleisti atgalinio ryšio parametrą: callback=?

2
25 сент. atsakymas yra danwellman 25 sep . 2012-09-25 23:16 '12 23:16 2012-09-25 23:16

Jei esate iš „Java“ fono, vienas galimas sprendimas būtų sukurti servletą, kuris remtųsi jūsų „JavaScript“ žiniatinklio paslaugomis. kažkas panašaus į žemiau esantį kodą GET (jūsų pasirinkimo) metode ...

 JsonElement jelement; JsonArray jarray; try { URL url = new URL("http://rest."YOUR URL"#ba0482"); URLConnection connection = url.openConnection(); connection.setDoInput(true); InputStream inStream = connection.getInputStream(); BufferedReader input = new BufferedReader(new InputStreamReader(inStream)); jelement = new JsonParser().parse(input); jarray = jelement.getAsJsonArray(); response.setContentType("application/json"); PrintWriter out = response.getWriter(); out.print(jarray); out.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 

Dabar javascript'e tiesiog nurodykite URL kaip servlet pavadinimą !!

2
09 янв. Saty yra atsakymas 2013-01-09 17:27 '13, 17:27, 2013-01-09 17:27

Naudodamasis ajax, kad galėčiau pasiekti php puslapį, susiduriu su tuo pačiu klaidos pranešimu (javascript ir php failai yra tame pačiame serveryje).

Priežastis yra ta, kad nurodiau IP adresą domene mano „JavaScript“. Dėl to naršyklė tikėjo, kad php failo skambutis yra kitame serveryje.

Taip paprasta išspręsti šį klaidos pranešimą. a) patikrinkite, ar javascript ir php failai yra tame pačiame serveryje; b) įsitikinkite, kad URL (ypač domenas) yra jūsų „JavaScript“ (pvz., http://www.smartana.co.uk/myJavaScript.js ) ajax atspindi jūsų serverio URL (pvz., http://www.smartana.co.uk/myServer.php ).

0
30 мая '15 в 14:42 2015-05-30 14:42 atsakymą pateikė Wolfi gegužės 30 d. 15 val. 14:42 2015-05-30 14:42

Kiti klausimai dėl etikečių arba Užduoti klausimą