CORS in GeoServer aktivieren (Steg)?

17

Ich hoffe, jemand hat das schon herausgefunden. Ich habe gerade Geoserver 2.9 auf einer Vanilla Ubuntu 16.04 Distribution installiert. Die Geoserver 2.8-Methode zum Aktivieren von CORS mit der shanbe.hezoun-Klasse funktioniert nicht mehr mit Jetty 9.2.13.

Es wird erwähnt, dass die CORS-Unterstützung bereits in Jetty 9.2.13 in der jetty-servlets.jar enthalten ist.

Die mit Geoserver kompilierte Jetty-Bibliothek enthält in geoserver / lib ein jetty-servlet-9.2.13.v20150730.jar, nicht jedoch jetty-servlets.9.2.13.v20150730.jar. Sollen diese das gleiche Glas mit einem anderen Namen sein?

Es sollte möglich sein, CORS entweder im Geoserver / etc / webdefault.xml oder im Geoserver / webapps / geoserver / WEB-INF / web.xml zu aktivieren.

Nach meinem Verständnis wird zuerst die Datei webdefault.xml und anschließend die Datei web.xml angewendet.

Ich habe versucht, Filter in beiden xml zu folgen. Ich bin noch nicht so weit, eine Filterzuordnung hinzuzufügen. Das Hinzufügen des Filters allein führt dazu, dass der Geoserver / Jetty-Dienst nicht ordnungsgemäß gestartet wird.

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
</filter>
Dennis Bauszus
quelle
1
Servlet und Servlets scheinen nicht dasselbe zu sein. Archive.eclipse.org/jetty/9.2.13.v20150730/apidocs/… . Und einige Links zu den von Ihnen verwendeten Dokumenten helfen denjenigen, die versuchen zu antworten.
user30184
Warum nicht Tomcat verwenden?
Ian Turton
1
Gute Frage. Ich habe Geoserver 2.9 mit Tomcat, wollte aber das Binär-Setup testen, um zu sehen, ob dies mein Leben leichter machen würde. Das hat es nicht getan.
Dennis Bauszus
Was war Ihre Lösung?
Kieveli
1
In Ordnung. Ich habe gerade das Problem für Geoserver 2.10 gelöst. Es ist meine Schuld, das Servlet-Glas nicht richtig installiert zu haben. Ich sollte die richtigen Servlets hier herunterladen und dann in das Verzeichnis "\ WEB-INF \ lib" kopieren und die Datei " WEB-INF \ web.xml " bearbeiten , um die Filterparameter hinzuzufügen, wie ich dem Kommentar von zflaw in diesem Thread gefolgt bin . Jetty v9 + hat das CORS bereits unterstützt.
Rizky Firmansyah

Antworten:

25

Bearbeiten Sie die webapps/geoserver/WEB-INF/web.xmlDatei. In dieser Datei befinden sich zwei Verweise auf CORS:

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

und

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

Sie müssen beide Blöcke auskommentieren (d. H. Entfernen <!--und -->aus den Blöcken filterund) filter-mapping.

Wenn Sie dann Jetty neu starten, können Sie mit einem Befehl wie dem folgenden testen, ob alles funktioniert:

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

was, wenn alles in Ordnung ist, zu einem Ergebnis führt wie:

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

Update 24. Oktober 2019

Es ist nicht länger erforderlich, das folgende Jar zu GeoServer hinzuzufügen (zumindest mit den Versionen 2.13.x und höher), und es wird ein Fehler verursacht . Ich hinterlasse diese Notiz hier für Leute, die gegen ältere Versionen kämpfen.

  1. Fügen Sie das Jetty-Utility-Servlets-Jar hinzu , um es an die Version von Jetty anzupassen - für aktuelle Versionen von GeoServer (2.15.x) ist es 9.4.12.v20180830 . Kopieren Sie dieses in webapps/geoserver/WEB-INF/libdas Verzeichnis geoserver-2.15.0 (oder an den Ort, an dem Sie die Zip entpackt haben) Datei).
Ian Turton
quelle
6
Für verschiedene Versionen von Geoserver habe ich die kompatible Stegverison mit erraten find $GEOSERVER_HOME -name "jetty*" | grep -E [[:digit:]].
Steven Kalt
1
Wie startet man den Steg neu?
user210757
Diese Lösung funktionierte nur, nachdem ich auch jetty-util zum libOrdner hinzugefügt hatte .
isshp
6

Es funktioniert, wenn Sie den Filter in "Geoserver / WebApp / Geoserver / WEB-INF / web.xml" und das JAR "Jetty-Servlets.9.2.13.v20150730.jar" in "Geoserver / WebApp / Geoserver" hinzufügen / WEB-INF / lib "

mano
quelle
Woher bekomme ich die Jetty-Servlets.9.2.13.v20150730.jar? Unterscheidet sich das von jetty-servlet-9.2.13.v20150730.jar, das in Geoserver 2.9 enthalten ist?
Dennis Bauszus
Ja, es ist anders. Beachten Sie auch, dass der Zielordner anders ist
Calanus
Ich verwende den Geoserver 2.8.2. Die Version des Stegs wird nicht angezeigt. Kann mir nicht sagen, wie ich die Version des Stegs finde. Ich sehe nur den Steg-6.8.1 in C: / Programme (x86) / GeoServer 2.8.2 / lib
veena Hosur
3

Mit Jetty9, UbuntuServer 16.04 musste ich auch /etc/jetty9/start.ini ändern, um nicht den folgenden Fehler zu erhalten:

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

Die Lösung ist hier : Sie sollten das Servlets-Modul in Ihrer $ {jetty.base} /start.ini aktivieren

folglich ersetzte ich:

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

durch :

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

Akzeptierte Antwort von Ian Turton ist hier absolut am besten. Da ich Docker verwende, ist die manuelle Bearbeitung nicht der Fall. Auch ich bin kein SED-Guru, aber dank der Struktur von web.xml (Zielzeichenfolgen sind im Dokumentbereich einzigartig) habe ich ein kleines Snippet:

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

Oder 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
Sanctus
quelle
0

Für jedermann ist fraglich, welche Version von Anlegestelle Sie für Ihre spezielle Geoserver-Anwendung haben.

Für OSX habe ich einfach den Geoserver gestartet und im Protokoll nachgeschaut, es sollte ungefähr so ​​aussehen:

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

Ich bin sicher, dass es in den Tomcat-Protokollen ähnlich ist, wenn es von einem Linux-Server ausgeführt wird, falls erforderlich.

Außerdem sollte es in den Antwortköpfen sichtbar sein, dh:

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

Wenn in der akzeptierten Antwort der Befehl curl verwendet wird, wird auch die Serverversion angezeigt:

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
quelle