完美geoserver跨域解决方式(2024版)

因为tomcat容器本身或者geoserver的安全策略,在tomcat中部署geoserver,导致在其他应用使用geoserver地图服务会出现跨域现象。
通常会通过nginx的反向代理解决这个问题。

但是安装nginx反过来又会让流程变得繁琐,将大象装到冰箱里就不止三部了。

我们知道,GeoServer的项目是一个完整的JavaJ2EE)系统。

所以,基于geoserver本身配置可以来解决这个问题。

但是百度搜索的结果不是过时,就是毫无责任的、误导人的遍地复制粘贴,也说明现在搜索引擎的尴尬局面:blog论坛贴吧的时代一去不复返,robot协议更加苛刻,搜索爬虫处于严重饥饿状态。 所以我们拿到的结果显得匮乏,难以命中问题。

好在chatgpt解决了一些问题,但是使用成本和难以预料的胡说八道,又让我们不得不审视其专业性。

废话不再多说

简要说下就是在tomcat中部署完geoserver,能正常访问后,通过修改geoserverweb.xml文件,将两个jar包添加到geoserverlib目录,就能完美解决跨域问题,重点是找到不同geoserver所对应的jar版本

下面细说步骤:
1、修改geoserver下的web.xml(路径一般为:/tomcat/webapps/geoserver/WEB-INF/web.xml),将文件中有关cross-origin的注释放开,但是可能会找错地方,最终造成geoserver打不开,保险的方式是:在文件空行中(如大约150行左右)直接添加以下配置;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
<init-param>
<param-name>chainPreflight</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>allowedOrigins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>allowedMethods</param-name>
<param-value>GET,POST,PUT,DELETE,HEAD,OPTIONS</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>

2、接下来我们需要找到geoserver对应版本的jetty-servletsjetty-utiljar文件;

3、首先我们确认下载的geoserver版本,如下
geoserver版本

3、然后复制版本号,拼接到如下url并访问,
https://github.com/geoserver/geoserver/blob/版本号/src/pom.xml (如:https://github.com/geoserver/geoserver/blob/2.23.2/src/pom.xml);

4、Ctrl+F搜索网页内容:jetty.version,复制版本号;
jetty版本

5、将版本号复制以下两个url中:

(1)https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-servlets/版本号 (如:https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-servlets/9.4.51.v20230217)

(2)https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-util/版本号 (如:https://mvnrepository.com/artifact/org.eclipse.jetty/jetty-util/9.4.51.v20230217)

6、单击jar下载文件;
jetty-servletsjetty-util

7、将jetty-servletsjetty-utiljar包拷贝到geoserver下的lib目录,路径为:tomcat/webapps/geoserver/WEB-INF/lib/

8、重启geoserver,暨重启tomcat,解决跨域。