29 votos

¿Habilitar CORS en GeoServer (jetty)?

Espero que alguien ya haya resuelto esto. Acabo de instalar Geoserver 2.9 en una distro Ubuntu 16.04 vainilla. El método de Geoserver 2.8 de habilitar CORS con la clase shanbe.hezoun ya no funciona con Jetty 9.2.13.

Se menciona que el soporte de CORS ya está empaquetado con Jetty 9.2.13 en el jetty-servlets.jar.

La librería Jetty que se compila con Geoserver contiene un jetty-servlet-9.2.13.v20150730.jar en geoserver/lib pero no jetty-servlets.9.2.13.v20150730.jar. ¿Se supone que son el mismo jar con un nombre diferente?

Debería ser posible habilitar CORS en geoserver/etc/webdefault.xml o en geoserver/webapps/geoserver/WEB-INF/web.xml.

Tengo entendido que el webdefault.xml se aplica primero y el web.xml después.

He probado el siguiente filtro en ambos xml. No he llegado a añadir un filtro de mapeo. El hecho de añadir el filtro por sí solo hace que el servicio Geoserver/Jetty no se inicie correctamente.

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
</filter>

48voto

Adam Ernst Puntos 6939

Editar el webapps/geoserver/WEB-INF/web.xml archivo. Hay dos referencias a CORS en este archivo:

<!-- Uncomment following filter to enable CORS -->
<filter>
  <filter-name>cross-origin</filter-name>
     <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
  </filter>

y

<!-- Uncomment following filter to enable CORS -->
<filter-mapping>
   <filter-name>cross-origin</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

Usted debe descomentar ambos bloques (es decir, eliminar <!-- y --> de la filter y filter-mapping bloques.

Luego, cuando reinicie Jetty puede probar que todo funciona utilizando un comando como:

curl -v -H "Origin: http://example.com" http://astun-desktop:9080/geoserver/wfs\?service\=WFS\&version\=2.0.0\&request\=GetFeature\&typenames\=sf:bugsites\&filter\=%3Cfes:Filter%20xmlns:fes\=%22http://www.opengis.net/fes/2.0%22%3E%3Cfes:ResourceId%20rid\=%22bugsites.3%22/%3E%3C/fes:Filter%3E

que si todo está bien dará un resultado como:

> User-Agent: curl/7.35.0
> Host: astun-desktop:9080
> Accept: */*
> Origin: http://example.com
>  
< HTTP/1.1 200 OK 
< Access-Control-Allow-Origin: http://example.com 
< Access-Control-Allow-Credentials: true 
< Access-Control-Expose-Headers:  
< Content-Type: text/xml; subtype=gml/3.2 
< Content-Disposition: inline; filename=geoserver-GetFeature.text 
< Transfer-Encoding: chunked
* Server Jetty(9.2.13.v20150730) is not blacklisted 
< Server: Jetty(9.2.13.v20150730) 
< 
* Connection #0 to host astun-desktop left intact 
<?xml version="1.0" encoding="UTF-8"?><wfs:FeatureCollection xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sf="http://www.openplans.org/spearfish" xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:gml="http://www.opengis.net/gml/3.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" numberMatched="1" numberReturned="1" timeStamp="2017-07-30T15:58:31.423Z" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://astun-desktop:9080/geoserver/schemas/wfs/2.0/wfs.xsd http://www.openplans.org/spearfish http://astun-desktop:9080/geoserver/wfs?service=WFS&amp;version=2.0.0&amp;request=DescribeFeatureType&amp;typeName=sf%3Abugsites http://www.opengis.net/gml/3.2 http://astun-desktop:9080/geoserver/schemas/gml/3.2.1/gml.xsd"><wfs:member><sf:bugsites gml:id="bugsites.3"><sf:the_geom><gml:Point srsName="urn:ogc:def:crs:EPSG::26713" srsDimension="2"><gml:pos>590529 4914625</gml:pos></gml:Point></sf:the_geom><sf:cat>3</sf:cat><sf:str1>Beetle site</sf:str1></sf:bugsites></wfs:member></wfs:FeatureCollection>%

Actualización 24 de octubre de 2019

Ya no es necesario añadir el siguiente tarro a GeoServer (al menos con las versiones 2.13.x y posteriores) y provocará un error . Dejo esta nota aquí para la gente que lucha contra las versiones más antiguas.

  1. Añade el Jetty-Utility Servlets Jar para que coincida con la versión de Jetty - para las versiones actuales de GeoServer (2.15.x) es 9.4.12.v20180830 Copie esto en webapps/geoserver/WEB-INF/lib dentro del directorio de geoserver-2.15.0 (o donde hayas descomprimido el archivo zip).

6voto

Steve Lianoglou Puntos 3792

Funcionará si añades el filtro en "geoserver/webapp/geoserver/WEB-INF/web.xml" y si añades el jar "jetty-servlets.9.2.13.v20150730.jar" dentro de "geoserver/webapp/geoserver/WEB-INF/lib"

3voto

ant Puntos 31

Con Jetty9, UbuntuServer 16.04, también tuve que modificar /etc/jetty9/start.ini, para no obtener el siguiente error :

2018-03-31 15:10:01.769:WARN:oejuc.AbstractLifeCycle:main: FAILED cross-origin: javax.servlet.UnavailableException: org.eclipse.jetty.servlets.CrossOriginFilter javax.servlet.UnavailableException: org.eclipse.jetty.servlets.CrossOriginFilter

la solución es aquí Deberías habilitar el módulo de servlets en tu ${jetty.base}/start.ini

En consecuencia, he sustituido :

--module=deploy,http,jsp,jstl,websocket,ext,resources

por :

--module=deploy,http,jsp,jstl,websocket,ext,resources,servlets

0voto

user299129 Puntos 101

La respuesta aceptada de Ian Turton es absolutamente la mejor aquí. Desde que estoy usando Docker edición manual no es el caso. También no soy un gurú de SED, pero gracias a la estructura de web.xml (cadenas de destino son únicos en el ámbito del documento), me vienen con pequeño fragmento:

sed -i 's_<!-- <filter>_<filter>_' web.xml
sed -i 's_</filter> -->_</filter>_' web.xml
sed -i 's_<!-- <filter-mapping>_<filter-mapping>_' web.xml
sed -i 's_</filter-mapping> -->_</filter-mapping>_' web.xml

O en Dockerfile:

# enable CORS
RUN wget -q http://central.maven.org/maven2/org/eclipse/jetty/jetty-servlets/9.2.13.v20150730/jetty-servlets-9.2.13.v20150730.jar -P ${GEOSERVER_INSTALL_DIR}/WEB-INF/lib \
 && sed -i 's_<!-- <filter>_<filter>_' ${GEOSERVER_INSTALL_DIR}/WEB-INF/web.xml \
 && sed -i 's_</filter> -->_</filter>_' ${GEOSERVER_INSTALL_DIR}/WEB-INF/web.xml \
 && sed -i 's_<!-- <filter-mapping>_<filter-mapping>_' ${GEOSERVER_INSTALL_DIR}/WEB-INF/web.xml \
 && sed -i 's_</filter-mapping> -->_</filter-mapping>_' ${GEOSERVER_INSTALL_DIR}/WEB-INF/web.xml

0voto

Herm Holland Puntos 21

Para cualquiera que se pregunte qué versión de jetty tiene para su aplicación particular de geoservidor.

Para OSX simplemente inicié geoserver y miré en el registro debería mostrar algo como:

2019-05-10 07:25:13.444:INFO:oejs.Server:startup executor: jetty-9.2.13.v20150730

Estoy seguro de que es similar en los registros de tomcat cuando se ejecuta desde un servidor linux si es necesario.

Además, debe ser visible en las cabeceras de respuesta, es decir:

Connection: close
Server: Jetty(9.2.13.v20150730)
X-Frame-Options: SAMEORIGIN

Es decir, como menciona la respuesta aceptada pruebe a utilizar el comando curl que también presentará la versión del servidor:

curl -v -H "Origin: http://example.com" http://astun-desktop:9080/geoserver/wfs\?service\=WFS\&version\=2.0.0\&request\=GetFeature\&typenames\=sf:bugsites\&filter\=%3Cfes:Filter%20xmlns:fes\=%22http://www.opengis.net/fes/2.0%22%3E%3Cfes:ResourceId%20rid\=%22bugsites.3%22/%3E%3C/fes:Filter%3E

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X