Mengaktifkan CORS di GeoServer (jetty)?

17

Saya harap seseorang sudah menemukan yang ini. Saya baru saja menginstal Geoserver 2.9 pada distro vanilla 16.04 Ubuntu. Metode Geoserver 2.8 untuk mengaktifkan CORS dengan kelas shanbe.hezoun tidak lagi berfungsi dengan Jetty 9.2.13.

Ada yang menyebutkan bahwa dukungan CORS sudah dikemas dengan Jetty 9.2.13 di jetty-servlets.jar.

Lib Jetty yang dikompilasi dengan Geoserver berisi jetty-servlet-9.2.13.v20150730.jar di geoserver / lib tetapi tidak jetty-servlets.9.2.13.v20150730.jar. Apakah ini seharusnya tabung yang sama dengan nama yang berbeda?

Seharusnya dimungkinkan untuk mengaktifkan CORS baik di geoserver / etc / webdefault.xml atau di geoserver / webapps / geoserver / WEB-INF / web.xml.

Pemahaman saya adalah bahwa webdefault.xml diterapkan terlebih dahulu dan web.xml sesudahnya.

Saya sudah mencoba filter berikut di kedua xml. Sejauh ini saya belum menambahkan pemetaan filter. Menambahkan filter saja akan menyebabkan layanan Geoserver / Jetty tidak dimulai dengan benar.

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
</filter>
Dennis Bauszus
sumber
1
Servlet dan servlets sepertinya tidak sama dengan archive.eclipse.org/jetty/9.2.13.v20150730/apidocs/… . Dan beberapa tautan ke dokumen yang Anda gunakan akan membantu mereka yang mencoba menjawab.
user30184
mengapa tidak menggunakan kucing jantan?
Ian Turton
1
Pertanyaan bagus. Saya memiliki Geoserver 2.9 berjalan dengan Tomcat tetapi ingin menguji pengaturan biner hanya untuk melihat apakah ini akan membuat hidup saya lebih mudah. Tidak.
Dennis Bauszus
Apa solusinya?
Kieveli
1
Baik. Saya baru saja menyelesaikan masalah untuk Geoserver 2.10. Ini kesalahan saya untuk tidak menginstal tabung servlets dengan benar. Saya harus mengunduh servlet yang benar di sini kemudian menyalin ke direktori "\ WEB-INF \ lib" dan mengedit " WEB-INF \ web.xml " untuk menambahkan parameter filter saat saya mengikuti komentar dari zflaw di utas ini . Jetty v9 + telah mendukung CORS.
Rizky Firmansyah

Jawaban:

26

Edit webapps/geoserver/WEB-INF/web.xmlfile. Ada dua referensi untuk CORS dalam file ini:

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

dan

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

Anda harus menghapus tanda komentar pada kedua blok (yang menghapus <!--dan -->dari filterdan filter-mappingblok.

Kemudian ketika Anda me-restart Jetty Anda dapat menguji bahwa semuanya berfungsi dengan menggunakan perintah seperti:

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

yang jika semuanya baik akan memberikan hasil seperti:

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

Perbarui 24 Oktober 2019

Tidak perlu lagi menambahkan toples berikut ke GeoServer (setidaknya dengan versi 2.13.x dan yang lebih baru) dan itu akan menyebabkan kesalahan . Saya meninggalkan catatan ini di sini untuk orang-orang yang melawan versi yang lebih lama.

  1. Tambahkan Jar Jetty-Utility Servlets agar sesuai dengan versi Jetty - untuk versi GeoServer saat ini (2.15.x) adalah 9.4.12.v20180830 , salin ini ke webapps/geoserver/WEB-INF/libdalam direktori geoserver-2.15.0 (atau di mana pun Anda membuka zip. mengajukan).
Ian Turton
sumber
6
Untuk versi geoserver yang berbeda, saya telah menebak penggunaan jetty verison yang kompatibel find $GEOSERVER_HOME -name "jetty*" | grep -E [[:digit:]].
Steven Kalt
1
Bagaimana Anda memulai kembali dermaga?
user210757
Solusi ini hanya berfungsi untuk saya setelah saya menambahkan jetty-util ke libfolder juga.
isshp
6

Ini akan berfungsi jika Anda menambahkan filter di "geoserver / webapp / geoserver / WEB-INF / web.xml" dan jika Anda menambahkan tabung "jetty-servlets.9.2.13.v20150730.jar" di dalam "geoserver / webapp / geoserver / WEB-INF / lib "

mano
sumber
Dari mana saya mendapatkan jetty-servlets.9.2.13.v20150730.jar? Apakah itu berbeda dengan jetty-servlet-9.2.13.v20150730.jar yang dikemas dengan Geoserver 2.9?
Dennis Bauszus
ya itu berbeda. Perhatikan juga folder tujuan berbeda
Calanus
Saya menggunakan geoserver 2.8.2. Versi dermaga tidak mendapatkan. Dapatkah saya memberi tahu saya bagaimana menemukan versi dermaga. Saya hanya melihat dermaga-6.8.1 di C: / Program Files (x86) / GeoServer 2.8.2 / lib
veena hosur
3

dengan Jetty9, UbuntuServer 16.04, saya juga harus memodifikasi /etc/jetty9/start.ini, agar tidak mendapatkan kesalahan berikut:

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

solusinya ada di sini : Anda harus mengaktifkan modul servlets di $ {jetty.base} /start.ini Anda

akibatnya, saya mengganti:

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

oleh :

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

Jawaban yang diterima oleh Ian Turton adalah yang terbaik di sini. Karena saya menggunakan pengeditan manual Docker tidak demikian. Saya juga bukan guru SED, tetapi berkat struktur web.xml (string target unik dalam cakupan dokumen), saya menghasilkan sedikit cuplikan:

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

Atau di 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
sumber
0

Bagi siapa pun yang bertanya versi dermaga mana yang Anda miliki untuk aplikasi geoserver khusus Anda.

Untuk OSX saya cukup memulai geoserver dan melihat log itu seharusnya menunjukkan sesuatu seperti:

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

Saya yakin itu serupa dalam log kucing jantan ketika menjalankan dari server linux jika diperlukan.

Juga, itu harus terlihat di header respons yaitu:

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

Yaitu, ketika jawaban yang diterima menyebutkan coba gunakan perintah curl itu akan menyajikan versi server juga:

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
sumber