¿Habilitando CORS en GeoServer (embarcadero)?

17

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

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

El Jetty lib 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 estos son el mismo frasco con un nombre diferente?

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

Entiendo que webdefault.xml se aplica primero y luego web.xml.

He intentado seguir el filtro en ambos xml. No he llegado tan lejos como para agregar un mapeo de filtro. Agregar el filtro solo hará 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>
Dennis Bauszus
fuente
1
Servlet y servlets no parecen ser el mismo archivo.eclipse.org/jetty/9.2.13.v20150730/apidocs/… . Y algunos enlaces a los documentos que ha utilizado ayudarían a quienes intentan responder.
user30184
¿Por qué no usar tomcat?
Ian Turton
1
Buena pregunta. Tengo Geoserver 2.9 ejecutándose con Tomcat, pero quería probar la configuración binaria solo para ver si esto me facilitaría la vida. No lo hizo.
Dennis Bauszus
¿Cuál fue tu solución?
Kieveli
1
Okay. Ya resolví el problema para Geoserver 2.10. Es mi culpa no haber instalado el servlets jar correctamente. Debería descargar los servlets correctos aquí y luego copiarlos en el directorio "\ WEB-INF \ lib" y editar el " WEB-INF \ web.xml " para agregar los parámetros de filtro mientras seguía el comentario de zflaw en este hilo . Jetty v9 + ya ha sido compatible con CORS.
Rizky Firmansyah

Respuestas:

26

Edita el webapps/geoserver/WEB-INF/web.xmlarchivo. 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 quitar <!--y -->de la filtery filter-mappingbloques.

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 oct.2019

Ya no es necesario agregar el siguiente jar a GeoServer (al menos con las versiones 2.13.xy posteriores) y provocará un error . Dejo esta nota aquí para las personas que luchan contra versiones anteriores.

  1. Agregue el Tarro de Servlets de Jetty-Utility para que coincida con la versión de Jetty: para las versiones actuales de GeoServer (2.15.x) es 9.4.12.v20180830 , cópielo webapps/geoserver/WEB-INF/libdentro del directorio geoserver-2.15.0 (o donde haya desempaquetado el zip archivo).
Ian Turton
fuente
66
Para diferentes versiones de geoserver, he estado adivinando el uso de jetty verison compatible find $GEOSERVER_HOME -name "jetty*" | grep -E [[:digit:]].
Steven Kalt
1
¿Cómo reinicias el embarcadero?
user210757
Esta solución funcionó para mí solo después de agregar jetty-util a la libcarpeta también.
isshp
6

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

mano
fuente
¿De dónde obtendría los jetty-servlets.9.2.13.v20150730.jar? ¿Es diferente al jetty-servlet-9.2.13.v20150730.jar que se empaqueta con Geoserver 2.9?
Dennis Bauszus
Sí, es diferente. También tenga en cuenta que la carpeta de destino es diferente
Calanus el
Estoy usando geoserver 2.8.2. La versión de Jetty no se puede obtener. Alguien puede decirme cómo encontrar la versión de jetty. Solo veo jetty-6.8.1 en C: / Archivos de programa (x86) / GeoServer 2.8.2 / lib
veena hosur
3

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 está aquí : debe habilitar el módulo de servlets en su $ {jetty.base} /start.ini

en consecuencia, reemplacé:

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

por:

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

La respuesta aceptada de Ian Turton es absolutamente mejor aquí. Como estoy usando la edición manual de Docker no es el caso. Además, no soy un gurú de SED, pero gracias a la estructura de web.xml (las cadenas de destino son únicas en el alcance del documento), se me ocurre un 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
Sanctus
fuente
0

Cualquiera se pregunta qué versión de embarcadero tiene para su aplicación de geoservidor particular.

Para OSX simplemente inicié geoserver y busqué en el registro que 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 los encabezados de respuesta, es decir:

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

Es decir, como la respuesta aceptada menciona intente usar el comando curl, 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
wired00
fuente