Usando OpenLayers 3, no puedo hacer que este mensaje desaparezca:
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.
Este es el código:
// 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
});
He intentado establecer la configuración de crossOrigin en:
crossOrigin: null
crossOrigin: 'null'
crossOrigin: 'anonymous'
Solo veo el control de acercamiento / alejamiento, pero la capa no se representa.
Fui con la opción 3 de Simon a continuación. Habilité CORS en GeoServer copiando los archivos jar necesarios de jetty-servlets y habilitándolo en \ WEB-INF \ web.xml:
<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>
Después de hacer eso, probé la página nuevamente y recibí el mismo error:
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.
Parece que todavía me falta algo. ¿Tengo que hacer algo desde el lado de OpenLayers?
Terminé deshaciéndome de Jetty y desinstalando GeoServer por completo. El problema es que cuando instalas el instalador de geoserver windows, ¡instala una versión de jetty que tiene 4 años! (Jetty versión 6.1.8) Aunque había copiado los archivos jar para CORS, solo es compatible con Jetty 7+.
Descubrí que puedes instalar un archivo WAR. Decidí usar Tomcat ya que eso es en lo que GeoServer se prueba principalmente según esta nota del sitio web de GeoServer:
Nota GeoServer se ha probado principalmente con Tomcat y, por lo tanto, estas instrucciones pueden no funcionar con otras aplicaciones de contenedor.
Estas son las instrucciones para instalar el archivo WAR:
http://docs.geoserver.org/stable/en/user/installation/war.html
Este es un buen video instructivo también:
https://www.youtube.com/watch?v=YEOA8WWWVCw
Después de completar la instalación, habilita CORS:
fuente
Respuestas:
En su lugar, hay una forma sencilla de solucionar el problema utilizando JSONP:
... ENABLE_JSONP verdadero ... 2. Reinicie su geoservidor. Ahora para la solicitud GetFeatureInfo , geoserver enviará parseResponse (datos JSON) al cliente
¿Cómo funciona JSONP desde el cliente (JavaScript)? La llamada JSONP es simple. Debe agregar un script con src = url (la url es GetFeatureInfo url) en el encabezado
var etiqueta = document.createElement ("script"); tag.src = url; document.getElementsByTagName ("cabeza") [0] .appendChild (etiqueta);
Una vez que se agrega el script, llamará a jsonp desde el servidor. invocando la función parseRespose. Por lo tanto, debe definir una función parseResponse de la siguiente manera. El alcance de esta función debe ser global.
function parseResponse (data) {var feature = data.features [0]; console.log (característica);
};
fuente
Yo mismo enfrenté el mismo problema e intenté muchas soluciones que discutí aquí o en otros foros y finalmente logré resolver el problema de habilitar Cross Origin en Geoserver.
Después de muchas pruebas, descubrí que la solución es bastante simple siguiendo los pasos exactos que se encuentran en la página web de Jetty Jetty Cross Origin Filter .
Pero con un pequeño cambio, la página dice que tenemos que copiar el siguiente filtro Cross-Origin en el archivo de configuración ( Web.xml ), pero la solución que funcionó conmigo es copiar esta configuración xml de filtro en ( webdefault.xml ) archivo de configuración, al aplicar este cambio, el geoservidor funcionó de maravilla y pude ejecutar cualquier WFS, WMS GetFeatureInfoRequest en formato JSON usando AJAX en lugar de usar IFrame soultion.
Estoy usando las siguientes versiones de software:
Aquí están los pasos detallados:
( jetty-servlets-7.6.13.v20130916.jar ). El nombre del archivo será diferente según la versión del muelle. No cambie su nombre. porque jetty hace coincidir el nombre del servlet con su versión como:
jetty-servlets - <% JETTY_VERSION%>. jar, así que no lo renombre.
Detenga los servicios (GeoServer, Postgres) y tome una copia del directorio de OpenGeo ubicado en
( C: \ Archivos de programa (x86) \ boundless \ OpenGeo ) y también copie el directorio de OpenGeo ubicado en
( C: \ ProgramData \ boundless \ OpenGeo ) antes de comenzar este tutorial, como medida de precaución.
Copie el archivo ( jetty-servlets-7.6.13.v20130916.jar ) (como está) en el directorio de jetty Lib
( * C: \ Archivos de programa (x86) \ boundless \ OpenGeo \ jetty \ lib * ) también el directorio puede cambie de acuerdo con su directorio de instalación.
( C: \ Archivos de programa (x86) \ boundless \ OpenGeo \ jetty \ ect \ webdefault.xml ), no estoy seguro de que la ubicación de estas líneas colocar en el archivo es importante o no, pero los pego a partir de la línea # 306 después
</serlet-mapping>
.Este tutorial funcionó para mí y espero que funcione para cualquiera que tenga el mismo problema.
fuente
La configuración crossOrigin solo existe (?) Para ol.source.TileImage. ( http://openlayers.org/en/master/apidoc/ol.source.TileImage.html - desmarca "Solo estable" en la esquina superior derecha). ol.source.GeoJSON no tiene una configuración crossOrigin, porque no puede acceder a JSON a través de solicitudes entre sitios.
Tienes diferentes formas de evitar esto:
problema similar, pero no relacionado con la geografía: /programming/5549068/json-how-do-i-make-cross-domain-json-call
fuente
Verifique los encabezados de respuesta de Geoserver en la pestaña Red de herramientas de desarrollo de Firebug / Chrome para ver si el encabezado Acces-Control-Allow-Origin: * está realmente allí. Si no, el problema está en el lado del contenedor de servlets. ¿O tal vez, si la aplicación es interna, configure un proxy en el servidor web primario en lugar de habilitar CORS? Esto último tendrá más sentido si su Geoserver iba a estar disponible públicamente.
fuente
Mi problema CORS fue resuelto por http://2carto.com/enable-cors-domain-geoserver-2-8/#comment-53 para GeoServer 2.8. (inútil para GeoServer 2.9)
fuente