Skip to content
fbma edited this page Nov 11, 2022 · 8 revisions

La política del mismo origen establece que, por motivos de seguridad, un script de una página web no puede acceder a contenido de dominios web diferentes de aquel en el que residen, salvo algunas excepciones, como contenido de tipo imagen. Es decir, no se permite cross domain.

La lógica del visualizador está implementada en javascript, por lo que está supeditada a dicha política del mismo origen. Eso significa que peticiones getMap o getLegendGraphic del estándar WMS pueden realizarse sin problemas ya que están solicitando imágenes, pero no ocurre lo mismo con peticiones como getCapabilities, getFeatures, getFeatureInfo, o cualquiera que devuelva contenido de otro tipo (GML/XML en estos casos).

Existen en la actualidad diversos enfoques que permiten a una aplicación realizar esas peticiones, y en Mapea se llevan a cabo haciendo uso de proxys.

Un proxy es una lógica o servicio que se encarga de realizar las peticiones de recursos que le solicita un tercero, en este caso el visualizador, ya que no está supeditado a la política del mismo origen generalmente al no estar implementado con scripts. Por lo tanto, el visualizador solicita el recurso a un proxy que esté en su mismo dominio, éste lo obtiene, y se lo devuelve al visualizador. En Mapea existen dos proxys diferentes: JSONP y POST.

Proxy JSONP

Este proxy devuelve el recurso solicitado en formato JSONP. Esto permite ejecutarlo directamente desde un script, en su atributo "src", mediante la función de callback definida en el cliente, sin que afecte así la política del mismo origen. Es por eso que este proxy no necesita estar desplegado en el mismo dominio que la aplicación web que lo llama. Cualquier aplicación puede usar por tanto el de Mapea:

https://mapea4-sigc.juntadeandalucia.es/mapea/api/proxy?url=https://mapea4-sigc.juntadeandalucia.es/mapea/files/wmc/contextCallejero.xml&callback=mifuncion

El programador no necesita hacer uso explícito de este proxy, el api de Mapea se hace cargo de llamarlo cuando sea necesario.

Proxy POST

Para algunas comunicaciones donde se adjunta un alto volumen de información, como por ejemplo en las peticiones WFST, no es viable el uso del proxy JSONP, debido a las limitaciones que establecen las peticiones GET.

Para esos casos ha de usarse el proxy POST. Debe estar desplegado en el mismo dominio que la aplicación, para que haya una comunicación entre ambos sin cross domain, y hay que configurar Mapea para que lo use.

Visibilidad

Como el acceso final al recurso que pide el visualizador lo realiza el proxy, éste debe tener visibilidad de dicho recurso. Es decir, si se solicita por ejemplo un fichero wmc, dicho fichero deberá estar en una url accesible por el proxy. Esto hay que tenerlo en cuenta especialmente cuando se trabaja en entornos de Prueba y de Desarrollo, donde por lo general los recursos que se usan no son públicos. En esos casos suelen usarse proxys locales durante la etapa de desarrollo, configurando Mapea para que use esos proxys.

Configuración de los proxys

La configuración de los proxys se lleva a cabo en el fichero configuration.js de Mapea. Para cambiar las urls de los mismos y usar otros proxys, después de haber importado dicho fichero, y antes de comenzar con la creación de los mapas, hay que indicar las nuevas urls mediante las siguientes instrucciones:

M.config('PROXY_POST_URL', '$URL_PROXY_POST');
M.config('PROXY_URL', '$URL_PROXY_JSONP');

También es posible desactivar el uso de proxys:

M.proxy(false);

Excepciones

A partir de la v5.1.0 de Mapea, es posible añadir servidores a una lista de excepciones, de manera que Mapea no utilizará el proxy a la hora de realizar peticiones a cualquier servidor que se encuentre en dicha lista. Eso es útil cuando los servidores permiten CORS para acceder a sus servicios, o cuando estamos accediendo a servidores de entornos de desarrollo que no son visibles por la instancia de Mapea que hace de proxy.

Por ejemplo, para añadir el servidor de mapas de SIGC "geostematicos-sigc" a esa lista de excepciones de proxys,basta con declararlo antes de que añadamos cualquier capa de ese servidor al mapa:

M.addProxyException("https://geostematicos-sigc.juntadeandalucia.es");
// La siguiente instrucción NO pasará por el proxy
mapa.addLayers(new M.layer.GeoJSON({
name: "Provincias", 
url: "https://geostematicos-sigc.juntadeandalucia.es/geoserver/tematicos/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=tematicos:Provincias&outputFormat=application/json"
}));
Clone this wiki locally