OpenLayers 3: solicitud de origen cruzado bloqueada: la misma política de origen rechaza

8

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:

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

usuario3657279
fuente
No puedo probarlo, la dirección que proporcionó no funciona.
Simon Zyx
Desafortunadamente, todo está en la intranet. Mis dos servidores (geoserver y servidor OL) están ambos en la intranet.
user3657279
Tomé con éxito la ruta "Actualización # 2" descrita anteriormente. Si planea hacer lo mismo, tenga en cuenta que el archivo web.xml se encuentra en la carpeta GeoServer recientemente implementada, por ejemplo: \ xampp \ tomcat \ webapps \ geoserver \ WEB-INF \ web.xml
Lauden

Respuestas:

4

En su lugar, hay una forma sencilla de solucionar el problema utilizando JSONP:

  1. Debe habilitar JSONP en el geoservidor. Para habilitar JSONP, debe agregar lo siguiente en su web.xml (por ejemplo, C: \ Archivos de programa (x86) \ GeoServer 2.4.4 \ webapps \ geoserver \ WEB-INF \ web.xml)

... ENABLE_JSONP verdadero ... 2. Reinicie su geoservidor. Ahora para la solicitud GetFeatureInfo , geoserver enviará parseResponse (datos JSON) al cliente

  1. ¿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);
};

Bikash
fuente
esta es una publicación antigua pero sentí el mismo problema, logré solucionarlo con JSONP pero es útil solo para obtener características de Geoserver, sin embargo, si tiene la intención de usar WFS-T, entonces está atascado, escribí algunos scripts php para operaciones CRUD como un plan B y aún buscando una forma de habilitar CORS en el geoservidor 2.9
Hicham Zouarhi
3

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:

  • Ilimitado OpenGeo v4.5.
  • Geoserver v 2.6.2.
  • Jetty v 7.6.13.v20130916.

Aquí están los pasos detallados:

  1. Descargue la versión coincidente de los servlets Jetty de acuerdo con su versión de embarcadero de esta página Servlets Jetty .
  2. En este ejemplo, estoy usando jetty v7.6.13.v20130916, por lo que el archivo jar debe llamarse
    ( 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.
  3. 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.

  4. 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.

  5. Copie y pegue las siguientes líneas xml en ( webdefault.xml ) ubicado en
    ( 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>.
<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. Inicie los servicios ( GeoServer , Postgres ), espere unos segundos y vaya a la página del geoservidor, el geoservidor se iniciará correctamente.

Este tutorial funcionó para mí y espero que funcione para cualquiera que tenga el mismo problema.

Ahmed GIS
fuente
Esta es la tercera pregunta a la que ha publicado la misma respuesta. ¿Sería capaz de revisar cada una de sus tres respuestas para decidir si realmente están respondiendo la pregunta que se hace o si son solo consejos genéricos, por favor?
PolyGeo
Simplemente no sabía cómo recurrir a mi otra respuesta, así que lo copié aquí de nuevo
Ahmed GIS
Al principio estaba buscando una solución para el problema de origen cruzado con Geoserver y Openlayers, después de encontrar una solución que quería compartir con otras personas que enfrentan el mismo problema, entonces busqué aquí estas palabras clave (CORS , Openlayers, Geoserver) y respondí las mismas preguntas a mi problema, pero no sabía cómo arbitrar a mi otra respuesta, así que la copié aquí nuevamente. No quiero repetir mi respuesta, quería ayudar a otros como este sitio increíble que me ayudó en otros problemas.
Ahmed GIS
No tengo acceso al geoservidor de la capa fuente y no sé qué ha hecho el propietario del servidor.
Magno C
@MagnoC Primero tiene que consultar con el propietario del servidor, tal vez haya cambiado el nombre de las capas u otra cosa.
Ahmed GIS
1

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:

  1. use un proxy web para llamadas ajax si no tiene acceso al servidor, de donde proviene el json. (Busque, por ejemplo, el proxy ajax)
  2. podría usar jsonp si tiene acceso al servidor. Esta normalmente es la solución preferida, pero no sé si funciona con geojson y es posible que deba sobrescribir la función del cargador ( http://en.wikipedia.org/wiki/JSONP - Cómo obtener JSON de Geoserver usando Solicitud de AJAX : http://openlayers.org/en/master/examples/vector-osm.js <: un ejemplo para usar una función de cargador personalizada)
  3. habilitar solicitudes de origen cruzado en el servidor. ( http://en.wikipedia.org/wiki/Cross-origin_resource_sharing )
  4. si los datos son estáticos, descárguelos y póngalos en su propio servidor (solo mencione la integridad)

problema similar, pero no relacionado con la geografía: /programming/5549068/json-how-do-i-make-cross-domain-json-call

Simon Zyx
fuente
Simon, consulta la Actualización n. ° 1 arriba según tu sugerencia. Gracias.
user3657279
0

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.

Michal Mackiewicz
fuente
Verifiqué los encabezados de respuesta yendo a Firebug -> pestaña "Red" y luego hice clic en la pestaña "Encabezados". Muestra 3 subsecciones: encabezados de respuesta, encabezados de solicitud y encabezados de respuesta de la memoria caché. No se menciona "Access-Control-Allow-Origin".
user3657279
El encabezado Access-Control-Allow-Origin debe residir en la subsección Encabezados de respuesta. Si no es así, intente reconfigurar su contenedor de servlets.
Michal Mackiewicz