[Javascript] jQuery AJAX Crossdomäne


Answers

JSONP ist eine gute Option, aber es gibt einen einfacheren Weg. Sie können einfach den Access-Control-Allow-Origin Header auf Ihrem Server festlegen. Wenn Sie ihn auf * werden domainübergreifende AJAX-Anfragen von jeder Domain akzeptiert. ( https://developer.mozilla.org/en/http_access_control )

Die Methode, um dies zu tun, wird natürlich von Sprache zu Sprache variieren. Hier ist es in Rails:

class HelloController < ApplicationController
  def say_hello
    headers['Access-Control-Allow-Origin'] = "*"
    render text: "hello!"
  end
end

In diesem Beispiel say_hello Aktion say_hello AJAX-Anfragen von einer beliebigen Domäne und gibt eine Antwort von "hallo!" Zurück.

Hier ist ein Beispiel für die Header, die es zurückgeben könnte:

HTTP/1.1 200 OK 
Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Type: text/html; charset=utf-8
X-Ua-Compatible: IE=Edge
Etag: "c4ca4238a0b923820dcc509a6f75849b"
X-Runtime: 0.913606
Content-Length: 6
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-07-09)
Date: Thu, 01 Mar 2012 20:44:28 GMT
Connection: Keep-Alive

So einfach es ist, es hat einige Browser-Einschränkungen. Siehe http://caniuse.com/#feat=cors .

Question

Hier sind zwei Seiten, test.php und testserver.php.

test.php

<script src="scripts/jq.js" type="text/javascript"></script>
<script>
    $(function() {
        $.ajax({url:"testserver.php",
            success:function() {
                alert("Success");
            },
            error:function() {
                alert("Error");
            },
            dataType:"json",
            type:"get"
        }
    )})
</script>

testserver.php

<?php
$arr = array("element1",
             "element2",
             array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>

Jetzt mein Problem: wenn diese beiden Dateien auf demselben Server (entweder localhost oder Webserver) sind, funktioniert es und alert("Success") wird aufgerufen; Wenn es auf verschiedenen Servern ist, also testserver.php auf dem Webserver und test.php auf localhost, funktioniert es nicht, und die alert("Error") wird ausgeführt. Auch wenn die URL in Ajax zu http://domain.com/path/to/file/testserver.php geändert wird




Verwenden Sie für übergreifende AJAX-Anfragen das folgende jQuery-Plugin. https://github.com/jinujd/jQuery-Async-Form Es funktioniert asynchron, ohne neu zu laden. Es ist nicht AJAX, aber es macht die Aufgabe in den meisten Fällen




Es ist richtig, dass die Richtlinie für denselben Ursprung verhindert, dass JavaScript domänenübergreifend Anfragen absetzt, aber die CORS-Spezifikation erlaubt genau die Art von API-Zugriff, nach der Sie suchen, und wird vom aktuellen Stapel der wichtigsten Browser unterstützt.

Informationen zum Aktivieren der werkübergreifenden Ressourcenfreigabe für Client und Server:

http://enable-cors.org/

"Cross-Origin Resource Sharing (CORS) ist eine Spezifikation, die einen wirklich offenen Zugriff über Domänengrenzen hinweg ermöglicht. Wenn Sie öffentliche Inhalte bereitstellen, sollten Sie CORS verwenden, um sie für den universellen JavaScript / Browser-Zugriff zu öffnen."




Sie müssen sich die gleiche Origin Policy ansehen:

In der Computerbranche ist die gleiche Ursprungsrichtlinie ein wichtiges Sicherheitskonzept für eine Reihe browserseitiger Programmiersprachen wie JavaScript. Die Richtlinie lässt Skripts, die auf Seiten laufen, die von derselben Site stammen, ohne besondere Einschränkungen auf die Methoden und Eigenschaften des jeweils anderen zugreifen, verhindert jedoch den Zugriff auf die meisten Methoden und Eigenschaften auf Seiten verschiedener Sites.

Damit Sie Daten bekommen können, muss es sein:

Gleiches Protokoll und Host

Sie müssen JSONP implementieren, um es zu umgehen.




Ich benutze Apache Server, also habe ich mod_proxy Modul verwendet. Module aktivieren:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Dann füge hinzu:

ProxyPass /your-proxy-url/ http://service-url:serviceport/

Übergeben Sie schließlich die Proxy-URL an Ihr Skript.




Für Microsoft Azure ist es etwas anders.

Azure verfügt über eine spezielle CORS-Einstellung, die festgelegt werden muss. Es ist im Wesentlichen das Gleiche hinter den Kulissen, aber einfach den Header Joshuarh Erwähnungen einzustellen wird nicht funktionieren. Die Azure-Dokumentation zum Aktivieren von Cross-Domain finden Sie hier:

https://docs.microsoft.com/en-us/azure/app-service-api/app-service-api-cors-consume-javascript

Ich habe ein paar Stunden damit herumgespielt, bevor ich festgestellt habe, dass meine Hosting-Plattform diese spezielle Einstellung hat.







Links