Включение CORS в GeoServer (причал)?

18

Я надеюсь, что кто-то уже понял это. Я только что установил Geoserver 2.9 на ванильный дистрибутив Ubuntu 16.04. Метод Geoserver 2.8 для включения CORS с классом shanbe.hezoun больше не работает с Jetty 9.2.13.

Есть упоминания о том, что поддержка CORS уже включена в Jetty 9.2.13 в файле jetty-servlets.jar.

Библиотека Jetty, которая скомпилирована с 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
Сервлет и сервлеты не похожи на archive.eclipse.org/jetty/9.2.13.v20150730/apidocs/… . А некоторые ссылки на использованные вами документы помогут тем, кто пытается ответить.
user30184 9.09.16
почему бы не использовать tomcat?
Ян Тертон
1
Хороший вопрос. У меня Geoserver 2.9 работает с Tomcat, но я хотел протестировать бинарную настройку, чтобы посмотреть, не облегчит ли это мне жизнь. Это не так.
Деннис Баусус
Каково было ваше решение?
Кьевели
1
Ok. Я только что решил проблему для Geoserver 2.10. Я виноват в том, что неправильно установил баночку с сервлетами. Я должен скачать правильные сервлеты здесь, затем скопировать в каталог "\ WEB-INF \ lib" и отредактировать " WEB-INF \ web.xml ", чтобы добавить параметры фильтра, как я следовал за комментарием от zflaw в этой теме . Jetty v9 + уже поддерживает CORS.
Ризки Фирмансях

Ответы:

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блоков.

Затем, когда вы перезапустите 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>%

Обновление 24 октября 2019

При этом больше не нужно добавлять следующий jar-файл в GeoServer (по крайней мере, с версиями 2.13.x и выше), и это вызовет ошибку . Я оставляю эту записку здесь для людей, борющихся со старыми версиями.

  1. Добавьте Jar сервлетных утилит Jetty в соответствии с версией Jetty - для текущих версий GeoServer (2.15.x) это 9.4.12.v20180830 , скопируйте его webapps/geoserver/WEB-INF/libв каталог geoserver-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" и добавите 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?
Деннис Баусус
да, это другое. Также обратите внимание, что папка назначения отличается
Calanus
Я использую geoserver 2.8.2. Версия Jetty не получается. Может ли кто-нибудь сказать мне, как найти версию для Jetty. Я вижу только jetty-6.8.1 в C: / Program Files (x86) / GeoServer 2.8.2 / lib
veena Хосур
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

следовательно, я заменил:

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

по :

--module=deploy,http,jsp,jstl,websocket,ext,resources,servlets
MaxiReglisse
источник
0

Принятый ответ Яна Тертона здесь абсолютно лучший. Так как я использую ручное редактирование 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
Sanctus
источник
0

Любой задается вопросом, какая версия Jetty у вас есть для вашего конкретного приложения геосервер.

Для OSX я просто запустил геосервер и посмотрел в журнале, что он должен показать что-то вроде:

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
wired00
источник