Vraag Waarom krijgt mijn JavaScript een "Nee" Toegang-Besturing-Toestaan-Oorsprong 'header is aanwezig op de gevraagde bron "-fout wanneer Postbode niet?


Ik probeer autorisatie te gebruiken met JavaScript door verbinding te maken met de REST  API ingebouwd fles. Nochtans, wanneer ik het verzoek maak, krijg ik de volgende fout:

XMLHttpRequest kan niet laden http: // myApiUrl / login. Geen 'Access-Control-Allow-Origin' header is aanwezig op de gevraagde bron. Origin 'null' is daarom geen toegang toegestaan.

Ik weet dat de API of externe resource de header moet instellen, maar waarom werkte het toen ik de aanvraag deed via de Chrome-extensie Postbode?

Dit is de aanvraagcode:

$.ajax({
    type: "POST",
    dataType: 'text',
    url: api,
    username: 'user',
    password: 'pass',
    crossDomain : true,
    xhrFields: {
        withCredentials: true
    }
})
    .done(function( data ) {
        console.log("done");
    })
    .fail( function(xhr, textStatus, errorThrown) {
        alert(xhr.responseText);
        alert(textStatus);
    });

1859
2017-11-17 19:29


oorsprong


antwoorden:


Als ik het goed heb begrepen, doe je het XMLHttpRequest naar een ander domein dan waarop uw pagina is ingeschakeld. Dus de browser blokkeert het omdat het meestal om veiligheidsredenen een verzoek in dezelfde bron toestaat. U moet iets anders doen als u een interdomeinverzoek wilt doen. Een tutorial over hoe dat te bereiken is CORS gebruiken.

Als u postbode gebruikt, zijn ze niet beperkt door dit beleid. Geciteerd uit Cross-Origin XMLHttpRequest:

Reguliere webpagina's kunnen het XMLHttpRequest-object gebruiken om gegevens van externe servers te verzenden en te ontvangen, maar ze worden beperkt door hetzelfde bronbeleid. Uitbreidingen zijn niet zo beperkt. Een extensie kan externe servers gebruiken buiten de oorspronkelijke locatie, op voorwaarde dat deze voor het eerst rechten van andere oorsprong verzoekt.


998
2017-11-17 19:49



Dit is geen oplossing voor productie of wanneer een toepassing aan de klant moet worden getoond, dit is alleen nuttig wanneer de gebruikersinterface en backend werken ontwikkeling  zijn op verschillend servers en in productie zijn ze eigenlijk op dezelfde server. Bijvoorbeeld: tijdens het ontwikkelen van een gebruikersinterface voor elke toepassing als het nodig is om de gebruikersinterface lokaal te testen met een backend-server, in dat geval is dit de perfecte oplossing. Voor productiefixatie moeten CORS-headers worden toegevoegd aan de back-end-server om toegang via kruisbeginselen toe te staan.

De eenvoudige manier is om de extensie in Google Chrome toe te voegen om toegang te krijgen met CORS.

(https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en-US)

Schakel deze extensie in wanneer u toegang wilt toestaan ​​tot Nee 'Access-control-allow-oorsprong' header-aanvraag.

Of 

Plak in Windows deze opdracht in rennen venster

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

dit opent een nieuw chroom browser die toegang geeft tot nee 'Access-control-allow-oorsprong' header-aanvraag.


451
2018-03-04 06:42



Als je kunt omgaan met JSON in ruil daarvoor, probeer dan JSONP (merk op P aan het einde) voor het spreken tussen domeinen:

$.ajax({
  type: "POST",
  dataType: 'jsonp',
  ...... etc ......

Meer informatie over werken met JSONP hier:

De komst van JSONP - in wezen een consensus cross-site scripting hack - heeft de deur geopend voor krachtige mashups van content. Veel prominente sites bieden JSONP-services, waardoor u via een vooraf gedefinieerde API toegang hebt tot hun inhoud.


311
2018-02-22 00:42



Het is heel eenvoudig om op te lossen als je gebruikt PHP. Voeg gewoon het volgende script toe aan het begin van uw PHP-pagina die de aanvraag behandelt:

<?php header('Access-Control-Allow-Origin: *'); ?>

Waarschuwing: Dit bevat een beveiligingsprobleem voor uw PHP-bestand dat door aanvallers zou kunnen worden aangeroepen. u moet sessies en cookies gebruiken voor authenticatie om uw bestand / service tegen deze aanval te voorkomen. Uw service is kwetsbaar voor cross-site aanvraag vervalsing (CSRF).

Als je gebruikt Node-rood je moet CORS toestaan ​​in de node-red/settings.js bestand door de volgende regels ongedaan te maken:

// The following property can be used to configure cross-origin resource sharing
// in the HTTP nodes.
// See https://github.com/troygoode/node-cors#configuration-options for
// details on its contents. The following is a basic permissive set of options:
httpNodeCors: {
 origin: "*",
 methods: "GET,PUT,POST,DELETE"
},

186
2017-12-03 20:24



Ik zou willen dat iemand lang geleden deze site met mij heeft gedeeld http://cors.io/ het zou een hoop tijd hebben bespaard in vergelijking met het bouwen en vertrouwen op mijn eigen proxy. Als u echter naar de productie gaat, is het hebben van uw eigen proxy de beste gok omdat u nog steeds alle aspecten van uw gegevens beheert.

Al wat je nodig hebt:

https://cors.io/?http://HTTP_YOUR_LINK_HERE


142
2017-07-21 22:08



Er is een probleem tussen domeinen met behulp van Ajax. U moet er zeker van zijn dat u uw bestanden op dezelfde manier bezoekt http:// pad zonder www. (of toegang vanaf http://www. en plaats op hetzelfde pad, inclusief www.) die de browser als een ander domein beschouwt bij toegang via a www. pad, zodat u ziet waar het probleem zit. U post naar een ander domein en de browser blokkeert de stroom vanwege het oorsprongsprobleem.

Als het API wordt niet geplaatst op dezelfde host waar u om vraagt, de stroom is geblokkeerd en u zult een andere manier moeten vinden om met de API te communiceren.


61
2018-03-12 08:53



Als je gebruikt Node.js, probeer het:

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

Meer informatie: CORS on ExpressJS


55
2018-02-12 16:27



Omdat
$ .ajax ({type: "POST"  - Oproepen OPTIES 
$ .post ( - Oproepen POST 

beide zijn verschillende Postman-oproepen "POST" correct, maar als we het noemen zullen het "OPTIES" zijn

Voor c # webservices - webapi 

Voeg de volgende code toe aan uw web.config-bestand onder de tag <system.webServer>. Dit zal werken

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
    </customHeaders>
</httpProtocol>

Zorg ervoor dat je geen fouten maakt in de ajax-oproep

jQuery

$.ajax({
    url: 'http://mysite.microsoft.sample.xyz.com/api/mycall',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },
    type: "POST", /* or type:"GET" or type:"PUT" */
    dataType: "json",
    data: {
    },
    success: function (result) {
        console.log(result);    
    },
    error: function () {
        console.log("error");
    }
});

Uitgave van hoek 4, zie: http://www.hubfly.com/blog/solutions/how-to-fix-angular-4-api-call-issues/

Notitie: Als je content wilt downloaden van de website van derden dan dit zal je niet helpen. U kunt de volgende code proberen, maar geen JavaScript.

System.Net.WebClient wc = new System.Net.WebClient();
string str = wc.DownloadString("http://mysite.microsoft.sample.xyz.com/api/mycall");

41
2017-12-13 13:02