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>

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).

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 ”


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.