Abilitare CORS in GeoServer (molo)?


17

Spero che qualcuno l'abbia già capito. Ho appena installato Geoserver 2.9 su una distribuzione Ubuntu 16.04 vanilla. Il metodo Geoserver 2.8 per abilitare CORS con la classe shanbe.hezoun non funziona più con Jetty 9.2.13.

Si dice che il supporto CORS sia già impacchettato con Jetty 9.2.13 in jetty-servlets.jar.

La libreria Jetty compilata con Geoserver contiene un jetty-servlet-9.2.13.v20150730.jar in geoserver / lib ma non jetty-servlets.9.2.13.v20150730.jar. Questi dovrebbero essere lo stesso barattolo con un nome diverso?

Dovrebbe essere possibile abilitare CORS in geoserver / etc / webdefault.xml o in geoserver / webapps / geoserver / WEB-INF / web.xml.

La mia comprensione è che webdefault.xml viene applicato per primo e successivamente web.xml.

Ho provato a seguire il filtro in entrambi XML. Non ho ottenuto l'aggiunta di una mappatura del filtro. Aggiungendo il filtro da solo, il servizio Geoserver / Jetty non si avvia correttamente.

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

1
Servlet e servlet non sembrano essere gli stessi archive.eclipse.org/jetty/9.2.13.v20150730/apidocs/… . E alcuni link ai documenti che hai usato aiuterebbero coloro che cercano di rispondere.
user30184

perché non usare Tomcat?
Ian Turton

1
Buona domanda. Ho Geoserver 2.9 in esecuzione con Tomcat ma volevo testare l'installazione binaria solo per vedere se questo mi avrebbe semplificato la vita. No
Dennis Bauszus,

Qual è stata la tua soluzione?
Kieveli,

1
Ok. Ho già risolto il problema per Geoserver 2.10. È colpa mia se non ho installato correttamente il vaso servlet. Devo scaricare le servlet corrette qui quindi copiare nella directory "\ WEB-INF \ lib" e modificare il " WEB-INF \ web.xml " essere aggiungere i parametri del filtro mentre seguivo il commento da zflaw in questa discussione . Jetty v9 + ha già supportato CORS.
Rizky Firmansyah,

Risposte:


26

Modifica il webapps/geoserver/WEB-INF/web.xmlfile. Ci sono due riferimenti a CORS in questo file:

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

e

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

È necessario decommentare entrambi i blocchi (ovvero rimuovere <!--e -->dai blocchi filtere filter-mapping.

Quindi quando riavvii Jetty puoi verificare che tutto funzioni usando un comando come:

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

che se tutto va bene darà un risultato come:

> 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>%

Aggiornamento 24 ottobre 2019

Non è più necessario aggiungere il seguente jar a GeoServer (almeno con le versioni 2.13.xe successive) e causerà un errore . Lascio qui questa nota per le persone che combattono le versioni precedenti.

  1. Aggiungi il Jar servlet Jetty-Utility per abbinare la versione di Jetty - per le versioni correnti di GeoServer (2.15.x) è 9.4.12.v20180830 , webapps/geoserver/WEB-INF/libcopialo nella directory geoserver-2.15.0 (o ovunque tu abbia decompresso lo zip file).

6
Per diverse versioni di geoserver, ho indovinato la versione compatibile del molo find $GEOSERVER_HOME -name "jetty*" | grep -E [[:digit:]].
Steven Kalt,

1
Come si riavvia il molo?
user210757

Questa soluzione ha funzionato per me solo dopo aver aggiunto anche jetty-util alla libcartella.
isshp

6

Funzionerà se aggiungi il filtro in "geoserver / webapp / geoserver / WEB-INF / web.xml" e se aggiungi il barattolo "jetty-servlets.9.2.13.v20150730.jar" all'interno "geoserver / webapp / geoserver / WEB-INF / lib"


Da dove otterrei i jetty-servlets.9.2.13.v20150730.jar? È diverso dal jetty-servlet-9.2.13.v20150730.jar che è impacchettato con Geoserver 2.9?
Dennis Bauszus,

sì, è diverso. Nota anche che la cartella di destinazione è diversa
Calanus

Sto usando geoserver 2.8.2. La versione del molo non viene visualizzata. Qualcuno può dirmi come trovare la versione del molo. Sto vedendo solo jetty-6.8.1 in C: / Programmi (x86) / GeoServer 2.8.2 / lib
veena sabato

3

con Jetty9, UbuntuServer 16.04, ho anche dovuto modificare /etc/jetty9/start.ini, in modo da non ottenere il seguente errore:

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 soluzione è qui : dovresti abilitare il modulo servlet nel tuo $ {jetty.base} /start.ini

di conseguenza, ho sostituito:

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

di:

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

0

La risposta accettata da Ian Turton è assolutamente la migliore qui. Dal momento che sto usando la modifica manuale Docker non è il caso. Inoltre non sono un guru SED, ma grazie alla struttura di web.xml (le stringhe di destinazione sono uniche nell'ambito del documento), mi viene in mente un piccolo frammento:

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 in 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

0

Per chiunque si sta chiedendo quale versione di molo hai per la tua particolare applicazione geoserver.

Per OSX ho semplicemente avviato geoserver e ho guardato nel registro che dovrebbe mostrare qualcosa del tipo:

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

Sono sicuro che è simile nei registri tomcat quando si esegue da un server Linux, se necessario.

Inoltre, dovrebbe essere visibile nelle intestazioni di risposta, ovvero:

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

Vale a dire, poiché la risposta accettata menziona il tentativo di usare il comando curl presenterà anche la versione del server:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.