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:
quelle
Antworten:
Es gibt eine einfache Möglichkeit, stattdessen JSONP zu umgehen:
... ENABLE_JSONP true ... 2. Starten Sie Ihren Geoserver neu. Für die GetFeatureInfo- Anforderung sendet der Geoserver nun parseResponse (JSON-Daten) an den Client
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);
};
quelle
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:
Hier sind die detaillierten Schritte:
( 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.
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.
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.
( 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>
.Dieses Tutorial hat für mich funktioniert und ich hoffe, es funktioniert für alle, die mit dem gleichen Problem konfrontiert sind.
quelle
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:
ähnliches Problem, aber nicht geobezogen: /programming/5549068/json-how-do-i-make-cross-domain-json-call
quelle
Ü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.
quelle
Mein CORS-Problem wurde von http://2carto.com/enable-cors-domain-geoserver-2-8/#comment-53 für GeoServer 2.8 behoben. (für GeoServer 2.9 nicht verwendbar)
quelle