【开发问题】GeoServer 跨域问题解决方案

by emanjusaka from https://www.emanjusaka.com/archives/geoserver-cross-error 彼岸花开可奈何
本文为原创文章,可能会更新知识点以及修正文中的一些错误,全文转载请保留原文地址,避免产生因未即时修正导致的误导。

博客:https://www.emanjusaka.com
博客园:https://www.cnblogs.com/emanjusaka
公众号:emanjusaka的编程栈

geoserver 默认是没有开启跨域配置的,我们在启动了 geoserver 服务,发布地图图层后。前端项目想要访问服务因为 IP 和端口不一致会造成跨域问题导致我们访问服务报错。

[Error] Cannot load image http://192.168.1.200:8080/geoserver/img/wms?REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&FORMAT=image%2Fpng&STYLES=&TRANSPARENT=TRUE&LAYERS=img%3Amap_03dbe5d1&CRS=EPSG%3A4326&serverType=geoserver&WIDTH=1032&HEIGHT=1491&SRS=EPSG%3A4326&BBOX=0.0006271289520698164%2C-0.10890253786480741%2C0.08920439945988232%2C0.019071018653747274 due to access control checks. [Error] Failed to load resource: Origin http://192.168.1.200 is not allowed by Access-Control-Allow-Origin. Status code: 200 (wms, line 0) 

下面给出怎么配置开启 geoserver 允许跨域访问。

下载安装geoserver

官网地址

【开发问题】GeoServer 跨域问题解决方案

一般我们选择稳定版就好了,2.28.0 不再支持 jdk8 了,如果需要 jdk8 的需要下载旧版本的 geoserver。

Nightly 版即夜间构建版,是开发团队通过自动化系统每日编译的软件版本。我们一般不选 Nightly 版本。

【开发问题】GeoServer 跨域问题解决方案

这里选第一个就好了,通过 jar 包启动,全平台都可用。

下载后文件目录如下图所示:

【开发问题】GeoServer 跨域问题解决方案

进入bin目录里面有启动脚本,Windows 平台启动 bat 脚本,Mac/Linux 平台启动 sh 脚本即可。

默认启动是不支持跨域的,下面我们来配置跨域。

配置跨域

  1. 进入 geoserver 目录下的 lib 文件夹,将其中的

    jetty-servlets-9.4.57.v20241219.jarjetty-util-9.4.57.v20241219.jar

    复制到 geoserver/webapps/geoserver/WEB-INF/lib

    【开发问题】GeoServer 跨域问题解决方案

【开发问题】GeoServer 跨域问题解决方案

这里有文章说去别的地方去下载这两个jar 包然后放到webapps/geoserver/WEB-INF/lib下,这里是没必要去下载的,geoserver 中已经包含有这两个 jar包了,复制过去就好了。自己去下载还要考虑版本问题,用 geoserver 自己版本一定是兼容的。

  1. 修改geoserver/webapps/geoserver/WEB-INF目录下的 web.xml 文件

    可以直接新增以下配置

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

    也可以打开 web.xml 配置文件中的注释,这些配置已经存在了只不过是被注释了。

    【开发问题】GeoServer 跨域问题解决方案

    【开发问题】GeoServer 跨域问题解决方案

    其中一部分配置大概位置在 143 行到 162 行。剩下的在 197 行到 162 行。

    这里要注意只需要打开通过 Jetty 配置跨域,通过 Tomcat 配置跨域不需要打开。因为我们只复制了 Jetty 相关的 jar包,如果打开了 Tomcat 的配置会因为缺少 jar 包而报错。

发表评论

评论已关闭。

相关文章