OpenLayers 3: Ursprungsübergreifende Anforderung blockiert: Die gleiche Ursprungsrichtlinie ist nicht zulässig

8

Mit OpenLayers 3 kann ich diese Nachricht nicht zum Verschwinden bringen:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver:8085/geoserver/sf/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sf:view1&maxFeatures=1&outputFormat=JSON. This can be fixed by moving the resource to the same domain or enabling CORS.

Dies ist der Code:

// Ol3 only supports Projections "EPSG:4326" and "EPSG:3857". For every other projection you need proj4js
        proj4.defs("EPSG:2236", "+proj=tmerc +lat_0=24.33333333333333 +lon_0=-81 +k=0.999941177 +x_0=200000.0001016002 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs");

        // Leases Layer
        var myLayer = new ol.layer.Vector({
            source: new ol.source.GeoJSON({
                projection: 'EPSG:2236',
                url: 'http://myserver:8085/geoserver/sf/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sf:view1&maxFeatures=1&outputFormat=JSON',
                crossOrigin: null
            })
        });

// View
        var view = new ol.View({
            projection: 'EPSG:2236',
            center: [0, 0],
            zoom: 4
        });

        // Map
        var map = new ol.Map({
            target: 'map',
            renderer: 'canvas',
            layers: [myLayer],
            view: view
        });

Ich habe versucht, die crossOrigin-Einstellung auf Folgendes einzustellen:

crossOrigin: null
crossOrigin: 'null'
crossOrigin: 'anonymous'

Ich sehe nur die Vergrößerungs- / Verkleinerungssteuerung, aber die Ebene wird nicht gerendert.


Ich habe mich für Simons Option 3 entschieden. Ich habe CORS in GeoServer aktiviert, indem ich die erforderlichen Jetty-Servlets-JAR-Dateien kopiert und in der Datei \ WEB-INF \ web.xml aktiviert habe:

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
    <init-param>
        <param-name>allowedOrigins</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>allowedMethods</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>allowedHeaders</param-name>
        <param-value>*</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>cross-origin</filter-name>
    <filter-pattern>/*</filter-pattern>
</filter-mapping>

Danach habe ich die Seite erneut getestet und den gleichen Fehler erhalten:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://myserver:8085/geoserver/sf/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=sf:view1&maxFeatures=1&outputFormat=JSON. This can be fixed by moving the resource to the same domain or enabling CORS.

Sieht so aus, als würde mir noch etwas fehlen. Muss ich irgendetwas von der OpenLayers-Seite tun?


Am Ende habe ich Jetty losgeworden und GeoServer komplett deinstalliert. Das Problem ist, wenn Sie das Geoserver Windows-Installationsprogramm installieren, wird eine Version von Jetty installiert, die 4 Jahre alt ist! (Jetty Version 6.1.8) Obwohl ich die JAR-Dateien für CORS kopiert hatte, wird es nur in Jetty 7+ unterstützt.

Ich habe herausgefunden, dass Sie eine WAR-Datei installieren können. Ich habe mich für Tomcat entschieden, da GeoServer gemäß diesem Hinweis auf der GeoServer-Website hauptsächlich getestet wird:

Hinweis GeoServer wurde größtenteils mit Tomcat getestet. Daher funktionieren diese Anweisungen möglicherweise nicht mit anderen Containeranwendungen.

Dies sind die Anweisungen zum Installieren der WAR-Datei:

http://docs.geoserver.org/stable/en/user/installation/war.html

Dies ist auch ein schönes Video mit Anleitungen:

https://www.youtube.com/watch?v=YEOA8WWWVCw

Nachdem Sie die Installation abgeschlossen haben, aktivieren Sie CORS:

http://enable-cors.org/server_tomcat.html

user3657279
quelle
Ich kann es nicht testen, die von Ihnen angegebene Adresse funktioniert nicht.
Simon Zyx
Leider ist alles im Intranet. Meine beiden Server (Geoserver und OL-Server) befinden sich beide im Intranet.
user3657279
Ich habe den oben beschriebenen Pfad "Update # 2" erfolgreich eingeschlagen. Wenn Sie dasselbe planen, denken Sie daran, dass sich die Datei web.xml unter dem neu bereitgestellten GeoServer-Ordner befindet, z. B.: \ Xampp \ tomcat \ webapps \ geoserver \ WEB-INF \ web.xml
Lauden,

Antworten:

4

Es gibt eine einfache Möglichkeit, stattdessen JSONP zu umgehen:

  1. Sie müssen JSONP auf dem Geoserver aktivieren. Um JSONP zu aktivieren, müssen Sie Folgendes in Ihre web.xml einfügen (z. B. C: \ Programme (x86) \ GeoServer 2.4.4 \ webapps \ geoserver \ WEB-INF \ web.xml).

... ENABLE_JSONP true ... 2. Starten Sie Ihren Geoserver neu. Für die GetFeatureInfo- Anforderung sendet der Geoserver nun parseResponse (JSON-Daten) an den Client

  1. Wie funktioniert JSONP vom Client aus (JavaScript)? JSONP-Aufruf ist einfach. Sie müssen ein Skript mit src = url (die URL ist GetFeatureInfo url) in den Header einfügen

    var tag = document.createElement ("script"); tag.src = url; document.getElementsByTagName ("head") [0] .appendChild (tag);

Sobald das Skript angehängt ist, ruft es jsonp vom Server auf. Aufrufen der Funktion parseRespose. Sie müssen also eine parseResponse-Funktion wie folgt definieren. Der Umfang dieser Funktion sollte global sein.

Funktion parseResponse (Daten) {var feature = data.features [0]; console.log (Funktion);
};

Bikash
quelle
Dies ist ein alter Beitrag, aber ich hatte das gleiche Problem. Ich habe es geschafft, ihn mit JSONP zu umgehen, aber es ist nur nützlich, um Funktionen von Geoserver zu erhalten. Wenn Sie jedoch beabsichtigen, WFS-T zu verwenden, stecken Sie fest. Ich habe einige PHP-Skripte geschrieben für CRUD-Operationen als Plan B und immer noch auf der Suche nach einer Möglichkeit, CORS in Geoserver 2.9 zu aktivieren
Hicham Zouarhi
3

Ich hatte selbst das gleiche Problem und habe viele Lösungen ausprobiert, die hier oder in anderen Foren diskutiert wurden. Schließlich gelang es mir, das Problem der Aktivierung von Cross Origin in Geoserver zu lösen.

Nach vielen Versuchen stellte ich fest, dass die Lösung ziemlich einfach ist und genau den Schritten folgt, die auf der Jetty-Webseite Jetty Cross Origin Filter zu finden sind .

Mit einer kleinen Änderung wurde auf der Seite angegeben, dass der folgende Cross-Origin-Filter in die Konfigurationsdatei ( Web.xml ) kopiert werden muss. Die Lösung, die bei mir funktioniert hat, besteht darin, diese Filter-XML-Konfiguration in ( webdefault.xml ) zu kopieren. Konfigurationsdatei, bei der Anwendung dieser Änderung arbeitete der Geoserver wie ein Zauber und ich konnte jedes WFS, WMS GetFeatureInfoRequest im JSON-Format mit AJAX anstelle von IFrame Soultion ausführen.

Ich verwende die folgenden Softwareversionen:

  • Grenzenloses OpenGeo v4.5.
  • Geoserver v 2.6.2.
  • Anlegestelle v 7.6.13.v20130916.

Hier sind die detaillierten Schritte:

  1. Laden Sie die passende Version der Jetty-Servlets entsprechend Ihrer Jetty-Version von dieser Seite herunter .
  2. In diesem Beispiel verwende ich jetty v7.6.13.v20130916, daher sollte die JAR-Datei den Namen
    ( jetty-servlets-7.6.13.v20130916.jar ) haben. Der Dateiname unterscheidet sich je nach Jetty-Version. Ändern Sie den Namen nicht Da der Steg dem Servlet-Namen mit seiner Version wie
    folgt übereinstimmt: Steg-Servlets - <% JETTY_VERSION%>. jar, benennen Sie ihn also nicht um.
  3. Beenden Sie die Dienste (GeoServer, Postgres) und erstellen Sie eine Kopie aus dem OpenGeo-Verzeichnis unter
    ( C: \ Programme (x86) \ boundless \ OpenGeo ). Kopieren Sie auch das OpenGeo-Verzeichnis unter
    ( C: \ ProgramData \ boundless \ OpenGeo ). vor dem Starten dieses Tutorials als Vorsichtsmaßnahme.

  4. Kopieren Sie die Datei ( jetty-servlets-7.6.13.v20130916.jar ) (wie sie ist) in das Verzeichnis jetty Lib
    ( * C: \ Programme (x86) \ boundless \ OpenGeo \ jetty \ lib * ) Ändern Sie entsprechend Ihrem Installationsverzeichnis.

  5. Kopieren Sie die folgenden XML-Zeilen und fügen Sie sie in die Datei ( webdefault.xml ) ein, die sich unter
    ( C: \ Programme (x86) \ boundless \ OpenGeo \ jetty \ ect \ webdefault.xml ) befindet. Ich bin mir nicht sicher, wo sich diese Zeilen befinden in der Datei zu Ort wichtig ist oder nicht , aber ich sich von Start einfügen Zeile # 306 nach </serlet-mapping>.
<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>cross-origin</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  1. Starten Sie die Dienste ( GeoServer , Postgres ), warten Sie einige Sekunden und navigieren Sie zur Geoserver-Seite. Der Geoserver wird ordnungsgemäß gestartet.

Dieses Tutorial hat für mich funktioniert und ich hoffe, es funktioniert für alle, die mit dem gleichen Problem konfrontiert sind.

Ahmed GIS
quelle
Dies ist die dritte Frage, auf die Sie dieselbe Antwort gepostet haben. Könnten Sie jede Ihrer drei Antworten überprüfen, um zu entscheiden, ob sie die gestellte Frage wirklich beantworten oder nur allgemeine Ratschläge sind?
PolyGeo
Ich wusste nur nicht, wie ich mich auf meine andere Antwort beziehen sollte, also habe ich sie hier noch einmal kopiert
Ahmed GIS
Am Anfang suchte ich nach einer Lösung für das Cross-Origin-Problem mit Geoserver und Openlayers. Nachdem ich eine Lösung gefunden hatte, wollte ich sie mit anderen Leuten teilen, die mit demselben Problem konfrontiert sind. Deshalb suchte ich hier nach diesen Schlüsselwörtern (CORS) , Openlayers, Geoserver) und ich beantworteten die gleichen Fragen zu meinem Problem, aber ich wusste nicht, wie ich auf meine andere Antwort verweisen sollte, also habe ich sie hier erneut kopiert. Ich möchte meine Antwort nicht wiederholen, ich wollte anderen helfen, wie diese erstaunliche Seite mir bei anderen Problemen geholfen hat.
Ahmed GIS
Ich habe keinen Zugriff auf den Geoserver der Quellschicht und weiß nicht, was der Serverbesitzer getan hat.
Magno C
@MagnoC Sie müssen sich zuerst beim Besitzer des Servers erkundigen, vielleicht hat er den Layernamen oder etwas anderes geändert.
Ahmed GIS
1

Die crossOrigin-Einstellung existiert nur (?) Für ol.source.TileImage. ( http://openlayers.org/en/master/apidoc/ol.source.TileImage.html - deaktivieren Sie "Nur stabil" in der oberen rechten Ecke). ol.source.GeoJSON hat keine crossOrigin-Einstellung, da Sie nicht über standortübergreifende Anforderungen auf JSON zugreifen können.

Sie haben verschiedene Möglichkeiten, dies zu umgehen:

  1. Verwenden Sie einen Webproxy für Ajax-Aufrufe, wenn Sie keinen Zugriff auf den Server haben, von dem der JSON stammt. (Suchen Sie zum Beispiel nach Ajax-Proxy)
  2. Sie können jsonp verwenden, wenn Sie Zugriff auf den Server haben. Dies ist normalerweise die bevorzugte Lösung, aber ich weiß nicht, ob es mit Geojson funktioniert, und Sie müssen möglicherweise die Loader-Funktion überschreiben ( http://en.wikipedia.org/wiki/JSONP - So erhalten Sie JSON von Geoserver mit AJAX-Anfrage - http://openlayers.org/en/master/examples/vector-osm.js <- ein Beispiel für die Verwendung einer benutzerdefinierten Ladefunktion)
  3. Aktivieren Sie originensübergreifende Anforderungen auf dem Server. ( http://en.wikipedia.org/wiki/Cross-origin_resource_sharing )
  4. Wenn die Daten statisch sind, laden Sie sie herunter und speichern Sie sie auf Ihrem eigenen Server (nur zur Vervollständigung)

ähnliches Problem, aber nicht geobezogen: /programming/5549068/json-how-do-i-make-cross-domain-json-call

Simon Zyx
quelle
Simon, siehe Update Nr. 1 oben gemäß deinem Vorschlag. Vielen Dank.
user3657279
0

Überprüfen Sie die Geoserver-Antwortheader auf der Registerkarte Firebug / Chrome Dev Tools Network, um festzustellen, ob der Header Acces-Control-Allow-Origin: * wirklich vorhanden ist. Wenn nicht, liegt das Problem auf der Seite des Servlet-Containers. Oder, wenn die Anwendung intern ist, einen Proxy auf dem primären Webserver einrichten, anstatt CORS zu aktivieren? Letzteres ist sinnvoller, wenn Ihr Geoserver öffentlich verfügbar sein soll.

Michal Mackiewicz
quelle
Ich habe die Antwortheader überprüft, indem ich zu Firebug -> "Net" gegangen bin und dann auf die Registerkarte "Headers" geklickt habe. Es werden 3 Unterabschnitte angezeigt: Antwortheader, Anforderungsheader und Antwortheader aus dem Cache. "Access-Control-Allow-Origin" wird nicht erwähnt.
user3657279
Der Access-Control-Allow-Origin-Header sollte sich im Unterabschnitt Response Headers befinden. Wenn dies nicht der Fall ist, konfigurieren Sie Ihren Servlet-Container neu.
Michal Mackiewicz