GeoServer(jetty)でCORSを有効にしますか?


17

誰かがすでにこれを理解していることを願っています。Geoserver 2.9をバニラUbuntu 16.04ディストリビューションにインストールしました。shanbe.hezounクラスでCORSを有効にするGeoserver 2.8メソッドは、Jetty 9.2.13では動作しなくなりました。

CORSサポートはjetty-servlets.jarのJetty 9.2.13に既にパッケージ化されているという言及があります。

GeoserverでコンパイルされたJettyライブラリには、geoserver / libにjetty-servlet-9.2.13.v20150730.jarが含まれていますが、jetty-servlets.9.2.13.v20150730.jarは含まれていません。これらは、異なる名前の同じjarであると想定されていますか?

geoserver / etc / webdefault.xmlまたはgeoserver / webapps / geoserver / WEB-INF / web.xmlでCORSを有効にすることができるはずです。

私の理解では、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
サーブレットとサーブレットは、同じarchive.eclipse.org/jetty/9.2.13.v20150730/apidocs/…ではないようです。そして、あなたが使用した文書へのいくつかのリンクは、答えようとする人々を助けるでしょう。
user30184 16

なぜtomcatを使用しないのですか?
イアンタートン

1
良い質問。TomcatでGeoserver 2.9を実行していますが、これが私の生活を楽にするかどうかを確認するために、バイナリセットアップをテストしたかったのです。しませんでした。
デニスバウス16

あなたの解決策は何でしたか?
Kieveli

1
OK。Geoserver 2.10の問題をすでに解決しました。サーブレットjarを正しくインストールしなかったことは私のせいです。ここで正しいサーブレットをダウンロードしてから、ディレクトリ「\ WEB-INF \ lib」にコピーし、「WEB-INF \ web.xml」を編集して、このスレッドの zflawからのコメントに従ってフィルターパラメーターを追加する必要があります。Jetty v9 +は既にCORSをサポートしています。
リスキーファーマンシャ

回答:


25

webapps/geoserver/WEB-INF/web.xmlファイルを編集します。このファイルには、CORSへの2つの参照があります。

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

あなたは必要がありますコメントを外し、両方の削除であること(ブロックを<!--して-->からfilterfilter-mappingブロック。

その後、Jettyを再起動すると、次のようなコマンドを使用して、すべてが機能していることをテストできます。

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

2019年10月24日更新

(少なくともバージョン2.13.x以降では)GeoServerに次のjarを追加する必要はなくなり、エラーが発生します。古いバージョンと戦っている人々のために、このメモをここに残しています。

  1. Jetty-Utility Servlets Jarを追加してJettyのバージョンに一致させます-GeoServerの現在のバージョン(2.15.x)の場合は9.4.12.v20180830で、これをwebapps/geoserver/WEB-INF/libgeoserver-2.15.0ディレクトリ(またはzipを解凍した場所)にコピーしますファイル)。

6
ジオサーバーのさまざまなバージョンでは、を使用して互換性のある突堤バージョンを推測していfind $GEOSERVER_HOME -name "jetty*" | grep -E [[:digit:]]ます。
スティーブンカルト

1
桟橋はどのように再起動しますか?
user210757

このソリューションは、jetty-utillibフォルダーに追加した後に初めて機能しました。
isshp

6

「geoserver / webapp / geoserver / WEB-INF / web.xml」にフィルターを追加し、「geoserver / webapp / geoserver」内にjar「jetty-servlets.9.2.13.v20150730.jar」を追加すると機能します。 / WEB-INF / lib "


どこからjetty-servlets.9.2.13.v20150730.jarを入手できますか?Geoserver 2.9にパッケージ化されているjetty-servlet-9.2.13.v20150730.jarとは異なりますか?
デニスバウス16年

はい、違います。また、宛先フォルダが異なることに注意してください
-Calanus

/プログラムファイル(x86の)/ GeoServer 2.8.2 / libに:私はCで唯一の桟橋-6.8.1を見ていgetting.Can任意の桟橋version.Iを見つける方法を教えてgeoserver 2.8.2.Jettyバージョンを使用しています
ヴィーナをホスール

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

解決策はこちらです:$ {jetty.base} /start.iniでservletsモジュールを有効にする必要があります

その結果、私は置き換えました:

--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の場合、単にジオサーバーを起動し、ログを調べて次のように表示されるはずです。

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

必要に応じてLinuxサーバーから実行する場合、Tomcatログでも同様であると確信しています。

また、応答ヘッダーに表示される必要があります。

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.