Włączasz CORS w GeoServer (jetty)?

18

Mam nadzieję, że ktoś już to wymyślił. Właśnie zainstalowałem Geoserver 2.9 na waniliowej dystrybucji Ubuntu 16.04. Metoda Geoserver 2.8 włączania CORS z klasą shanbe.hezoun nie działa już z Jetty 9.2.13.

Istnieją wzmianki, że obsługa CORS jest już spakowana z Jetty 9.2.13 w jetty-servlets.jar.

Biblioteka Jetty skompilowana z Geoserver zawiera jetty-servlet-9.2.13.v20150730.jar w geoserver / lib, ale nie jetty-servlets.9.2.13.v20150730.jar. Czy to ma być ten sam słoik o innej nazwie?

Powinno być możliwe włączenie CORS w geoserver / etc / webdefault.xml lub w geoserver / webapps / geoserver / WEB-INF / web.xml.

Rozumiem, że plik webdefault.xml jest stosowany najpierw, a następnie plik web.xml.

Próbowałem następujących filtrów w obu XML. Do tej pory nie dodałem mapowania filtrów. Dodanie samego filtra spowoduje, że usługa Geoserver / Jetty nie uruchomi się poprawnie.

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
</filter>
Dennis Bauszus
źródło
1
Servlet i serwlety nie wydają się być tym samym archive.eclipse.org/jetty/9.2.13.v20150730/apidocs/… . A niektóre linki do dokumentów, których użyłeś, pomogłyby tym, którzy próbują odpowiedzieć.
user30184
dlaczego nie użyć tomcat?
Ian Turton
1
Dobre pytanie. Mam Geoserver 2.9 działający z Tomcat, ale chciałem przetestować konfigurację binarną, aby zobaczyć, czy to ułatwi moje życie. Nie udało się.
Dennis Bauszus,
Jakie było twoje rozwiązanie?
Kieveli
1
Dobrze. Właśnie rozwiązałem problem z Geoserver 2.10. To moja wina, że ​​nie zainstalowałem poprawnie słoika serwletów. Powinienem pobrać tutaj odpowiednie serwlety , a następnie skopiować do katalogu „\ WEB-INF \ lib” i edytować plik „ WEB-INF \ web.xml ”, aby dodać parametry filtru, gdy śledziłem komentarz zflaw w tym wątku . Jetty v9 + obsługuje już CORS.
Rizky Firmansyah,

Odpowiedzi:

27

Edytuj webapps/geoserver/WEB-INF/web.xmlplik. Tam są tym pliku dwa odniesienia do CORS:

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

i

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

Państwo musi odkomentowaniu zarówno bloków (które to usunąć <!--i -->od filteri filter-mappingbloków.

Następnie po ponownym uruchomieniu Jetty możesz sprawdzić, czy wszystko działa, używając polecenia takiego jak:

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

co, jeśli wszystko będzie dobrze, da wynik taki jak:

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

Zaktualizuj 24 października 2019 r

Nie jest już konieczne dodawanie następującego słoika do GeoServer (przynajmniej w wersji 2.13.xi późniejszych) i spowoduje to błąd . Zostawiam tę notatkę tutaj dla osób walczących ze starszymi wersjami.

  1. Dodaj jar serwletów Jetty-Utility, aby pasował do wersji Jetty - w przypadku bieżących wersji GeoServer (2.15.x) jest to 9.4.12.v20180830 , skopiuj go do webapps/geoserver/WEB-INF/libkatalogu geoserver-2.15.0 (lub gdziekolwiek rozpakowałeś zip plik).
Ian Turton
źródło
6
W przypadku różnych wersji geoserver zgadywałem, który jest zgodny z wersją pomostu find $GEOSERVER_HOME -name "jetty*" | grep -E [[:digit:]].
Steven Kalt,
1
Jak zrestartować jetty?
user210757,
To rozwiązanie działało dla mnie dopiero po dodaniu jetty-util do libfolderu.
isshp
6

Będzie działać, jeśli dodasz filtr w „geoserver / webapp / geoserver / WEB-INF / web.xml” i jeśli dodasz jar „jetty-servlets.9.2.13.v20150730.jar„ inside ”geoserver / webapp / geoserver / WEB-INF / lib ”

mano
źródło
Skąd mam wziąć jetty-servlets.9.2.13.v20150730.jar? Czy różni się to od jetty-servlet-9.2.13.v20150730.jar, który jest dostarczany z Geoserver 2.9?
Dennis Bauszus
tak, jest inaczej. Pamiętaj też, że folder docelowy jest inny
Calanus
Używam geoserver 2.8.2. Wersja Jetty nie dostaje się. Czy ktoś może mi powiedzieć, jak znaleźć wersję jetty. Widzę tylko jetty-6.8.1 w C: / Program Files (x86) / GeoServer 2.8.2 / lib
veena hosur
3

w przypadku Jetty9, UbuntuServer 16.04 musiałem również zmodyfikować /etc/jetty9/start.ini, aby nie pojawił się następujący błąd:

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

rozwiązanie jest tutaj : powinieneś włączyć moduł serwletów w swoim $ {jetty.base} /start.ini

w związku z tym zastąpiłem:

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

przez :

--module=deploy,http,jsp,jstl,websocket,ext,resources,servlets
MaxiReglisse
źródło
0

Odpowiedź zaakceptowana przez Iana Turtona jest tutaj absolutnie najlepsza. Ponieważ korzystam z ręcznej edycji Dockera, nie ma to miejsca. Nie jestem też guru SED, ale dzięki strukturze pliku web.xml (ciągi docelowe są unikalne w zakresie dokumentu), wymyśliłem mały fragment:

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

Lub w 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
źródło
0

Dla każdego zastanawia się, którą wersję pomostu masz dla konkretnej aplikacji geoserver.

W przypadku OSX po prostu uruchomiłem geoserver i zajrzałem do dziennika, powinien on pokazywać coś takiego:

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

Jestem pewien, że jest podobny w logach tomcat, gdy jest uruchamiany z serwera Linux w razie potrzeby.

Ponadto powinien być widoczny w nagłówkach odpowiedzi, tj .:

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

Tzn., Jak wspomniano w zaakceptowanej odpowiedzi, spróbuj użyć polecenia curl, a także przedstawi wersję serwera:

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
przewodowy00
źródło