Habilitando o CORS no GeoServer (cais)?

17

Espero que alguém já tenha entendido isso. Acabei de instalar o Geoserver 2.9 em uma distribuição baunilha do Ubuntu 16.04. O método Geoserver 2.8 de habilitar o CORS com a classe shanbe.hezoun não funciona mais com o Jetty 9.2.13.

Há menções de que o suporte ao CORS já está incluído no Jetty 9.2.13 no jetty-servlets.jar.

A lib do Jetty que é compilada com o Geoserver contém um jetty-servlet-9.2.13.v20150730.jar no geoserver / lib, mas não o jetty-servlets.9.2.13.v20150730.jar. Eles deveriam ser o mesmo frasco com um nome diferente?

Deve ser possível ativar o CORS no geoserver / etc / webdefault.xml ou no geoserver / webapps / geoserver / WEB-INF / web.xml.

Entendo que o webdefault.xml seja aplicado primeiro e o web.xml posteriormente.

Eu tentei seguir o filtro em ambos xml. Não cheguei a adicionar um mapeamento de filtro. Adicionar o filtro sozinho fará com que o serviço Geoserver / Jetty não seja iniciado corretamente.

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
</filter>
Dennis Bauszus
fonte
1
Servlet e servlets não parecem ser o mesmo archive.eclipse.org/jetty/9.2.13.v20150730/apidocs/… . E alguns links para os documentos que você usou ajudariam aqueles que tentam responder.
user30184
por que não usar o tomcat?
Ian Turton
1
Boa pergunta. Eu tenho o Geoserver 2.9 rodando com o Tomcat, mas queria testar a configuração binária apenas para ver se isso tornaria minha vida mais fácil. Isso não aconteceu.
Dennis Bauszus 9/09/16
Qual foi a sua solução?
Kieveli 22/09/16
1
Está bem. Eu já resolvi o problema para o Geoserver 2.10. A culpa é minha de não instalar os servlets corretamente. Eu deveria baixar os servlets corretos aqui , copiar no diretório "\ WEB-INF \ lib" e editar o " WEB-INF \ web.xml " para adicionar os parâmetros de filtro enquanto seguia o comentário do zflaw neste segmento . O Jetty v9 + já suportou o CORS.
Rizky Firmansyah

Respostas:

26

Edite o webapps/geoserver/WEB-INF/web.xmlarquivo. Existem duas referências ao CORS neste arquivo:

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

e

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

Você deve remover o comentário dos dois blocos (que é remover <!--e -->dos blocos filtere filter-mapping.

Então, quando você reiniciar o Jetty, poderá testar se tudo está funcionando usando um comando como:

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

que, se tudo estiver bem, dará um resultado como:

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

Atualização 24 de outubro de 2019

Não é mais necessário adicionar o seguinte jar ao GeoServer (pelo menos nas versões 2.13.xe posteriores) e isso causará um erro . Estou deixando esta nota aqui para pessoas que lutam com versões mais antigas.

  1. Adicione o jar do Jetty-Utility Servlets para corresponder à versão do Jetty - para as versões atuais do GeoServer (2.15.x), é 9.4.12.v20180830 , copie-o para webapps/geoserver/WEB-INF/libdentro do diretório geoserver-2.15.0 (ou onde quer que você descompacte o zip Arquivo).
Ian Turton
fonte
6
Para diferentes versões do geoserver, eu tenho adivinhado o compatível jetty verison usando find $GEOSERVER_HOME -name "jetty*" | grep -E [[:digit:]].
Steven Kalt
1
Como você reinicia o cais?
user210757
Essa solução funcionou para mim somente depois que adicionei o jetty-util à libpasta.
isshp
6

Funcionará se você adicionar o filtro em "geoserver / webapp / geoserver / WEB-INF / web.xml" e se adicionar o jar "jetty-servlets.9.2.13.v20150730.jar" dentro de "geoserver / webapp / geoserver / WEB-INF / lib "

mano
fonte
De onde obteria o jetty-servlets.9.2.13.v20150730.jar? Isso é diferente do jetty-servlet-9.2.13.v20150730.jar, fornecido com o Geoserver 2.9?
Dennis Bauszus
sim é diferente. Observe também a pasta de destino é diferente
Calanus
Estou usando o geoserver 2.8.2.Jetty versão não está conseguindo. Pode me dizer como encontrar a versão jetty. Estou vendo apenas jetty-6.8.1 em C: / Arquivos de Programas (x86) / GeoServer 2.8.2 / lib
veena hosur
3

com o Jetty9, UbuntuServer 16.04, eu também tive que modificar o /etc/jetty9/start.ini, para não obter o seguinte erro:

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

a solução está aqui : você deve ativar o módulo servlets em seu $ {jetty.base} /start.ini

consequentemente, substituí:

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

por :

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

A resposta aceita por Ian Turton é absolutamente melhor aqui. Como estou usando a edição manual do Docker, esse não é o caso. Também não sou um guru do SED, mas, graças à estrutura do web.xml (as strings de destino são únicas no escopo do documento), criei um pequeno trecho:

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

Ou no 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
fonte
0

Para quem está se perguntando qual versão do jetty você possui para o seu aplicativo geoserver específico.

Para o OSX, simplesmente iniciei o geoserver e procurei no log que deveria mostrar algo como:

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

Tenho certeza de que é semelhante nos logs do tomcat ao executar em um servidor linux, se necessário.

Além disso, ele deve estar visível nos cabeçalhos de resposta, ou seja:

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

Ou seja, como a resposta aceita menciona tentar usar o comando curl, ele também apresentará a versão do servidor:

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
fonte