เปิดใช้งาน CORS ใน GeoServer (ท่าเทียบเรือ) หรือไม่


18

ฉันหวังว่าจะมีใครบางคนคิดออกแล้ว ฉันเพิ่งติดตั้ง Geoserver 2.9 บน vanilla Ubuntu 16.04 distro วิธีการใช้ Geoserver 2.8 ในการเปิดใช้งาน CORS ด้วยคลาส shanbe.hezoun จะไม่ทำงานกับ Jetty 9.2.13 อีกต่อไป

มีการกล่าวถึงว่าการสนับสนุน CORS ได้รับการบรรจุด้วย Jetty 9.2.13 ใน Jetty-servlets.jar

The Jetty lib ซึ่งรวบรวมด้วย Geoserver มี jetty-servlet-9.2.13.v20150730.jar ใน geoserver / lib แต่ไม่ใช่ jetty-servlets.9.2.13.v20150730.jar สิ่งเหล่านี้ควรจะเป็นขวดเดียวกันกับชื่ออื่นหรือไม่?

คุณควรเปิดใช้งาน CORS ใน geoserver / etc / webdefault.xml หรือใน geoserver / webapps / geoserver / WEB-INF / web.xml

ความเข้าใจของฉันคือว่า webdefault.xml ถูกนำไปใช้ก่อนและหลังจากนั้น web.xml

ฉันลองตัวกรองต่อไปนี้ทั้งใน xml ฉันยังไม่ได้เพิ่มการแมปตัวกรอง การเพิ่มตัวกรองเพียงอย่างเดียวจะทำให้บริการ Geoserver / Jetty เริ่มไม่เหมาะสม

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

1
ดูเหมือนว่า servlet และ servlets จะเป็นไฟล์เก็บถาวรเดียวกันไม่ได้ และลิงก์ไปยังเอกสารที่คุณใช้จะช่วยผู้ที่พยายามตอบคำถาม
user30184

ทำไมไม่ใช้ Tomcat?
Ian Turton

1
คำถามที่ดี. ฉันมี Geoserver 2.9 ที่ทำงานกับ Tomcat แต่ต้องการทดสอบการติดตั้งไบนารีเพื่อดูว่าสิ่งนี้จะทำให้ชีวิตของฉันง่ายขึ้นหรือไม่ มันไม่ได้
Dennis Bauszus

อะไรคือทางออกของคุณ?
Kieveli

1
ตกลง. ฉันเพิ่งแก้ไขปัญหาสำหรับ Geoserver 2.10 แล้ว เป็นความผิดของฉันที่จะไม่ติดตั้ง servlets jar อย่างถูกต้อง ฉันควรดาวน์โหลด servlets ที่ถูกต้องที่นี่แล้วคัดลอกไปยังไดเรกทอรี"\ WEB-INF \ lib"และแก้ไข " WEB-INF \ web.xml " เพื่อเพิ่มพารามิเตอร์ตัวกรองตามที่ฉันทำตามความคิดเห็นจาก zflaw ในหัวข้อนี้ Jetty v9 + รองรับ CORS แล้ว
Rizky Firmansyah

คำตอบ:


27

แก้ไขwebapps/geoserver/WEB-INF/web.xmlไฟล์ มีการอ้างอิงถึง CORS สองไฟล์ในไฟล์นี้:

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

และ

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

คุณต้องยกเลิกการคอมเม้นต์ทั้งบล็อก (ที่ถูกลบ<!--และออก-->จากfilterและfilter-mappingบล็อก

จากนั้นเมื่อคุณรีสตาร์ทท่าเทียบเรือคุณสามารถทดสอบว่าทุกอย่างทำงานได้โดยใช้คำสั่งเช่น:

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

ซึ่งหากทุกอย่างดีจะให้ผลลัพธ์เช่น:

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

อัปเดต 24 ตุลาคม 2019

มันก็ไม่จำเป็นที่จะเพิ่มขวดต่อไปนี้เพื่อ GeoServer (อย่างน้อยกับรุ่น 2.13.x และต่อมา) และมันจะก่อให้เกิดข้อผิดพลาด ฉันจะออกจากบันทึกนี้ที่นี่สำหรับคนที่ต่อสู้กับรุ่นเก่ากว่า

  1. เพิ่มJetty-Utility Servlets Jarเพื่อให้ตรงกับเวอร์ชั่นของ Jetty - สำหรับ GeoServer รุ่นปัจจุบัน (2.15.x) คือ9.4.12.v20180830คัดลอกสิ่งนี้ไปwebapps/geoserver/WEB-INF/libไว้ในไดเรกทอรี geoserver-2.15.0 (หรือที่ใดก็ตามที่คุณคลาย zip) ไฟล์).

6
สำหรับรุ่นที่แตกต่างกันของ geoserver find $GEOSERVER_HOME -name "jetty*" | grep -E [[:digit:]]ฉันได้รับการคาดเดาท่าเทียบเรือที่เข้ากันได้รูปแบบที่ใช้
Steven Kalt

1
คุณจะเริ่มท่าเทียบเรือได้อย่างไร
user210757

วิธีนี้ใช้ได้ผลกับฉันหลังจากที่ฉันเพิ่มJetty-utilไปยังlibโฟลเดอร์ด้วย
isshp

6

มันจะทำงานถ้าคุณเพิ่มตัวกรองใน "geoserver / webapp / geoserver / WEB-INF / web.xml" และถ้าคุณเพิ่ม jar "jetty-servlets.9.2.13.v20150730.jar" ภายใน "geoserver / webapp / geoserver / WEB-INF / lib"


ฉันจะรับท่าเทียบเรือได้จากที่ใด 9..2.13.v20150730.jar ซึ่งต่างจาก jetty-servlet-9.2.13.v20150730.jar ซึ่งบรรจุด้วย Geoserver 2.9 หรือไม่?
Dennis Bauszus

ใช่มันแตกต่างกัน และโปรดสังเกตว่าโฟลเดอร์ปลายทางนั้นแตกต่างออกไป
Calanus

ฉันใช้ geoserver รุ่น 2.8.2.Jetty ไม่ได้รับสามารถบอกวิธีการค้นหา Jetty version ได้ฉันเห็นเฉพาะ Jetty-6.8.1 ใน C: / Program Files (x86) / GeoServer 2.8.2 / lib
veena hosur

3

ด้วย Jetty9, UbuntuServer 16.04 ฉันต้องแก้ไข /etc/jetty9/start.ini ด้วยเพื่อที่จะไม่ได้รับข้อผิดพลาดต่อไปนี้:

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

วิธีแก้ปัญหาอยู่ที่นี่ : คุณควรเปิดใช้งานโมดูล servlets ใน $ {jetty.base} /start.ini ของคุณ

ดังนั้นฉันแทนที่:

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

โดย:

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

0

คำตอบที่ยอมรับโดย Ian Turton ดีที่สุดที่นี่ เนื่องจากฉันใช้การแก้ไขด้วยตนเองของ Docker ไม่ใช่กรณี นอกจากนี้ฉันไม่ใช่กูรู SED แต่ด้วยโครงสร้างของ web.xml (สตริงเป้าหมายมีความเป็นเอกลักษณ์ในขอบเขตของเอกสาร) ฉันจึงได้ตัวอย่างข้อมูลเล็กน้อย:

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

หรือใน 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

สำหรับใครที่กำลังสงสัยว่าคุณมีท่าเทียบเรือรุ่นใดสำหรับแอปพลิเคชันเซิร์ฟเวอร์เฉพาะของคุณ

สำหรับ OSX ฉันเริ่มต้น geoserver และดูในบันทึกมันควรแสดงสิ่งที่ชอบ:

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

ฉันแน่ใจว่ามันจะคล้ายกันในบันทึก Tomcat เมื่อเรียกใช้จากเซิร์ฟเวอร์ linux หากจำเป็น

นอกจากนี้ควรปรากฏในส่วนหัวการตอบสนองเช่น:

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

เช่นเดียวกับคำตอบที่ได้รับการยอมรับลองใช้คำสั่ง curl มันจะแสดงเวอร์ชั่นของเซิร์ฟเวอร์ด้วย:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.