GeoServer에서 CORS를 사용 (jetty) 하시겠습니까?


18

누군가가 이미 이것을 알아 냈기를 바랍니다. 방금 바닐라 우분투 16.04 배포판에 Geoserver 2.9를 설치했습니다. shanbe.hezoun 클래스로 CORS를 활성화하는 Geoserver 2.8 방법은 더 이상 Jetty 9.2.13에서 작동하지 않습니다.

CORS 지원은 jetty-servlets.jar에 Jetty 9.2.13과 함께 패키지되어 있다는 언급이 있습니다.

Geoserver로 컴파일 된 Jetty lib는 geoserver / lib에 jetty-servlet-9.2.13.v20150730.jar를 포함하지만 jetty-servlets.9.2.13.v20150730.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

왜 바람둥이를 사용하지 않습니까?
Ian Turton

1
좋은 질문. Tomcat으로 Geoserver 2.9를 실행하고 있지만 바이너리 설정을 테스트하여 이것이 내 삶을 더 편하게 할 수 있는지 확인하고 싶었습니다. 그렇지 않았다.
Dennis Bauszus

당신의 해결책은 무엇입니까?
Kieveli

1
확인. Geoserver 2.10의 문제를 이미 해결했습니다. 서블릿 병을 올바르게 설치하지 않은 것은 내 잘못입니다. 여기에 올바른 서블릿을 다운로드 한 다음 "\ 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>

당신은 해야한다 의 주석을 모두 블록 (즉, 제거하다 <!---->으로부터 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 일 업데이트

더 이상 다음 jar을 GeoServer 에 추가 할 필요가 없으며 (최소 버전 2.13.x 이상) 오류 가 발생합니다 . 나는 이전 버전과 싸우는 사람들을 위해이 메모를 남길 것입니다.

  1. Jetty 버전과 일치 하도록 Jetty-Utility Servlets Jar 를 추가하십시오 -GeoServer (2.15.x)의 현재 버전은 9.4.12.v20180830입니다. 이를 webapps/geoserver/WEB-INF/libgeoserver-2.15.0 디렉토리 안에 복사하십시오 (또는 압축을 푼 곳마다) 파일).

6
다양한 버전의 지오 서버에서을 사용하여 호환 가능한 부두 버전을 추측했습니다 find $GEOSERVER_HOME -name "jetty*" | grep -E [[:digit:]].
Steven Kalt

1
부두를 어떻게 다시 시작합니까?
user210757

이 솔루션은 jetty-utillib폴더에 추가 한 후에 만 ​​작동했습니다 .
isshp

6

"geoserver / webapp / geoserver / WEB-INF / web.xml"에 필터를 추가하고 "geoserver / webapp / geoserver 내에"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과 다른가요?
Dennis Bauszus

예, 다릅니다. 또한 대상 폴더가 다릅니다
Calanus

내가 getting.Can 어떤 방법 C 만 부두-6.8.1 보는 부두 version.I 오전 찾을 말하지 geoserver 2.8.2.Jetty 버전을 사용하고 있습니다 : / 프로그램 파일 (x 86) / 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

해결책은 여기 있습니다 : $ {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의 경우 지오 서버를 시작하고 로그를 살펴보면 다음과 같이 표시됩니다.

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.