CORS - Tomcat - Geoserver

30

大家好, 我正在尝试在Tomcat 7.0.52上为Geoserver启用CORS。

我按照http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CORS_Filter中的说明,修改了tomcat中conf文件夹下的web.xml文件。

但是,这并没有帮助设置头部的跨源资源共享。

我甚至尝试了对geoserver web-inf/web.xml文件进行修改,但也没有效果。

欢迎提出任何建议。

谢谢!


鉴于不存在 Tomcat 版本为 7.0.57,你实际使用的是哪个版本?你到底向哪个 web.xml 文件中添加了什么内容? - Mark Thomas
抱歉打错了字 - 应该是7.0.52。 - user1680784
为了测试目的,在上述链接中“这是更高级配置的示例,覆盖了默认值:”下面是xml部分。我知道这可能会很开放,但经过测试后,可以修改为更合适的内容。 - user1680784
你把那段文本添加到哪个XML文件中了?你需要回答人们提出的所有问题。 - Mark Thomas
Tomcat\conf -> 所有Web应用程序的web.xml。我甚至尝试了GeoServer WEB-LIB\web.xml来使其工作! - user1680784
WEB-LIB\xml?真的吗?我建议启用调试日志,但是快速扫描代码表明这不会告诉您任何有用的信息。您能否对Tomcat实例进行远程调试? - Mark Thomas
4个回答

49

为了避免在OpenLayers中使用代理,我需要做同样的事情。

由于我正在运行Ubuntu 12.04,所以我安装了 Tomcat 7.0.55,而不是默认的7.0.26(从软件包中安装)。

为了添加CORS标头,我只需将以下行添加到 $CATALINA_HOME/conf/web.xml 中:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

然后重新启动Tomcat。

例如,当我尝试从我的应用程序(运行在http://localhost:3000)获取Geoserver的URL http://development.localhost.lan/geoserver/wfs时,我会收到以下标头信息:

请求的标头:

POST /geoserver/wfs HTTP/1.1
Host: development.localhost.lan
Origin: http://localhost:3000
X-Requested-With: XMLHttpRequest
(...)

响应头:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:3000
Connection:Keep-Alive
Content-Disposition:inline; filename=geoserver-GetFeature.text
Content-Encoding:gzip
Content-Length:469
Content-Type:text/xml; subtype=gml/3.1.1
Date:Tue, 29 Jul 2014 21:31:08 GMT
Keep-Alive:timeout=5, max=100
Server:Apache-Coyote/1.1

这适用于Chrome(Ver. 35.0.1916.153)和Firefox(Ver. 31.0)。


2
对我来说,该文件位于/var/lib/tomcat7/webapps/geoserver/WEB-INF/web.xml - Terry Brown
它能解决身份验证问题吗? - csandreas1
对我来说,文件位于/var/lib/tomcat8/webapps/geoserver/WEB-INF/web.xml。最终解决了问题。感谢@jgrocha和Terry Brown。 - Awais Khan

6
我需要向CorsFilter中添加以下内容,以确保预检的“OPTIONS”请求被允许。
<init-param>
  <param-name>cors.allowed.methods</param-name>
  <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
</init-param>

如果需要其他方法,这是对@jgrocha所给答案的有用补充。 - sbk

2
在我的情况下,我使用了kartoza/geoserver docker镜像,并且我需要从GeoServer网站下载GeoServer war文件(用于docker镜像中使用的版本),并将geoserver.war文件添加到目录/usr/local/tomcat/webapps/中,并重新启动tomcat。
只有在上述配置下,我才成功启用CORS。仅将corsFilter代码添加到web.xml并重新启动tomcat会导致访问GeoServer时出现404错误。因此,在添加war文件后,corsFilter代码被识别并且可以正常工作。
我希望这能帮助遇到类似问题的人。

-1

大家好,在web.xml中添加了这个脚本后

<filter>
    <filter-name>cross-origin</filter-name>
    <filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
    <init-param>
        <param-name>allowedOrigins</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>allowedMethods</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>allowedHeaders</param-name>
        <param-value>*</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>cross-origin</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

请将您的ajax中的URL更改为以下内容

var boxsource = new ol.source.Vector({
        //url: '{{ resource.ows_url|safe }}',
        url: 'http://localhost:8080/geoserver/wfs?srsName=EPSG%3A4326&typename=cite:box&outputFormat=json&version=1.1.0&service=WFS&request=GetFeature',
        format: new ol.format.GeoJSON(),

        params: {'LAYERS': '{{ resource.typename }}'},
        //STYLES:{'LAYERS': '{{ resource.typename }}'}

    });

那就好了,我保证。


1
不要将 jetty servlet 添加到 tomcat 安装中。 - Ian Turton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接