Activation de CORS dans GeoServer (jetée)?


18

J'espère que quelqu'un a déjà compris celui-ci. Je viens d'installer Geoserver 2.9 sur une distribution Ubuntu 16.04 vanilla. La méthode Geoserver 2.8 d'activation de CORS avec la classe shanbe.hezoun ne fonctionne plus avec Jetty 9.2.13.

Il est mentionné que la prise en charge de CORS est déjà fournie avec Jetty 9.2.13 dans le jetty-servlets.jar.

La bibliothèque Jetty qui est compilée avec Geoserver contient un jetty-servlet-9.2.13.v20150730.jar dans geoserver / lib mais pas jetty-servlets.9.2.13.v20150730.jar. Sont-ils censés être le même pot avec un nom différent?

Il devrait être possible d'activer CORS dans geoserver / etc / webdefault.xml ou dans geoserver / webapps / geoserver / WEB-INF / web.xml.

Ma compréhension est que le webdefault.xml est appliqué en premier et le web.xml par la suite.

J'ai essayé de suivre le filtre dans les deux xml. Je n'ai pas réussi à ajouter un mappage de filtre. L'ajout du filtre seul entraînera le démarrage incorrect du service Geoserver / Jetty.

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

1
Servlet et servlets ne semblent pas être les mêmes archive.eclipse.org/jetty/9.2.13.v20150730/apidocs/… . Et certains liens vers les documents que vous avez utilisés aideraient ceux qui essaient de répondre.
user30184

pourquoi ne pas utiliser tomcat?
Ian Turton

1
Bonne question. J'ai Geoserver 2.9 fonctionnant avec Tomcat mais je voulais tester la configuration binaire juste pour voir si cela me faciliterait la vie. Ce ne fut pas le cas.
Dennis Bauszus

Quelle a été ta solution?
Kieveli

1
D'accord. Je viens de résoudre le problème pour Geoserver 2.10. C'est ma faute de ne pas avoir installé correctement le pot de servlets. Je devrais télécharger les servlets corrects ici, puis copier dans le répertoire "\ WEB-INF \ lib" et éditer le " WEB-INF \ web.xml " pour ajouter les paramètres de filtre pendant que je suivais le commentaire de zflaw dans ce fil . Jetty v9 + a déjà pris en charge le CORS.
Rizky Firmansyah

Réponses:


27

Modifiez le webapps/geoserver/WEB-INF/web.xmlfichier. Il y a deux références à CORS dans ce fichier:

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

et

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

Vous devez décommenter les deux blocs (c'est-à-dire supprimer <!--et -->des blocs filteret filter-mapping.

Ensuite, lorsque vous redémarrez Jetty, vous pouvez tester que tout fonctionne en utilisant une commande comme:

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

qui si tout va bien donnera un résultat comme:

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

Mise à jour du 24 octobre 2019

Il n'est plus nécessaire d'ajouter le pot suivant à GeoServer (au moins avec les versions 2.13.x et ultérieures) et cela provoquera une erreur . Je laisse cette note ici pour les gens qui combattent les anciennes versions.

  1. Ajoutez le pot de servlets Jetty-Utility pour correspondre à la version de Jetty - pour les versions actuelles de GeoServer (2.15.x), il s'agit de 9.4.12.v20180830 , copiez-le webapps/geoserver/WEB-INF/libdans le répertoire geoserver-2.15.0 (ou là où vous avez déballé le zip fichier).

6
Pour différentes versions de geoserver, j'ai deviné la version de la jetée compatible en utilisant find $GEOSERVER_HOME -name "jetty*" | grep -E [[:digit:]].
Steven Kalt du

1
Comment redémarrer la jetée?
user210757

Cette solution n'a fonctionné pour moi qu'après avoir ajouté jetty-util au libdossier également.
isshp

6

Cela fonctionnera si vous ajoutez le filtre dans "geoserver / webapp / geoserver / WEB-INF / web.xml" et si vous ajoutez le pot "jetty-servlets.9.2.13.v20150730.jar" à l'intérieur "geoserver / webapp / geoserver / WEB-INF / lib "


D'où puis-je obtenir les jetty-servlets.9.2.13.v20150730.jar? Est-ce différent du jetty-servlet-9.2.13.v20150730.jar fourni avec Geoserver 2.9?
Dennis Bauszus

oui c'est différent. Notez également que le dossier de destination est différent
Calanus

J'utilise geoserver 2.8.2.La version Jetty ne fonctionne pas.Peut-on me dire comment trouver la version Jetty.Je ne vois que Jetty-6.8.1 dans C: / Program Files (x86) / GeoServer 2.8.2 / lib
veena hosur

3

avec Jetty9, UbuntuServer 16.04, j'ai également dû modifier /etc/jetty9/start.ini, afin de ne pas obtenir l'erreur suivante:

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 solution est : vous devez activer le module servlets dans votre $ {jetty.base} /start.ini

par conséquent, j'ai remplacé:

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

par :

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

0

La réponse acceptée par Ian Turton est absolument la meilleure ici. Puisque j'utilise l'édition manuelle de Docker, ce n'est pas le cas. Je ne suis pas non plus un gourou du SED, mais grâce à la structure de web.xml (les chaînes cibles sont uniques dans la portée du document), je propose un petit extrait:

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

Ou dans 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

Pour quiconque se demande quelle version de jetty vous avez pour votre application géoserveur particulière.

Pour OSX, j'ai simplement démarré geoserver et regardé dans le journal, il devrait montrer quelque chose comme:

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

Je suis sûr qu'il est similaire dans les journaux tomcat lors de l'exécution à partir d'un serveur Linux si nécessaire.

Il doit également être visible dans les en-têtes de réponse, à savoir:

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

Autrement dit, comme la réponse acceptée mentionne essayer d'utiliser la commande curl, elle présentera également la version du serveur:

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.