没有记忆的猪 發表於 2025-10-22 17:16:00

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

<blockquote>
<p>by emanjusaka fromhttps://www.emanjusaka.com/archives/geoserver-cross-error 彼岸花开可奈何<br>
本文为原创文章,可能会更新知识点以及修正文中的一些错误,全文转载请保留原文地址,避免产生因未即时修正导致的误导。</p>
</blockquote>
<p>博客:https://www.emanjusaka.com<br>
博客园:https://www.cnblogs.com/emanjusaka<br>
公众号:emanjusaka的编程栈</p>
<p>geoserver 默认是没有开启跨域配置的,我们在启动了 geoserver 服务,发布地图图层后。前端项目想要访问服务因为 IP 和端口不一致会造成跨域问题导致我们访问服务报错。</p>
<pre><code class="language-txt"> Cannot load image http://192.168.1.200:8080/geoserver/img/wms?REQUEST=GetMap&amp;SERVICE=WMS&amp;VERSION=1.1.1&amp;FORMAT=image%2Fpng&amp;STYLES=&amp;TRANSPARENT=TRUE&amp;LAYERS=img%3Amap_03dbe5d1&amp;CRS=EPSG%3A4326&amp;serverType=geoserver&amp;WIDTH=1032&amp;HEIGHT=1491&amp;SRS=EPSG%3A4326&amp;BBOX=0.0006271289520698164%2C-0.10890253786480741%2C0.08920439945988232%2C0.019071018653747274 due to access control checks.
Failed to load resource: Origin http://192.168.1.200 is not allowed by Access-Control-Allow-Origin. Status code: 200 (wms, line 0)
</code></pre>
<p>下面给出怎么配置开启 geoserver 允许跨域访问。</p>
<h2 id="下载安装geoserver">下载安装geoserver</h2>
<p>官网地址</p>
<p><img src="https://file.emanjusaka.com/emanjusaka/image-20251016133144314-0592721.png"></p>
<p>一般我们选择稳定版就好了,2.28.0 不再支持 jdk8 了,如果需要 jdk8 的需要下载旧版本的 geoserver。</p>
<p>Nightly 版即夜间构建版,是开发团队通过自动化系统每日编译的软件版本。我们一般不选 Nightly 版本。</p>
<p><img src="https://file.emanjusaka.com/emanjusaka/image-20251016133539847-0592943.png"></p>
<p>这里选第一个就好了,通过 jar 包启动,全平台都可用。</p>
<p>下载后文件目录如下图所示:</p>
<p><img src="https://file.emanjusaka.com/emanjusaka/image-20251016133718737-0593042.png"></p>
<p>进入<code>bin</code>目录里面有启动脚本,Windows 平台启动 bat 脚本,Mac/Linux 平台启动 sh 脚本即可。</p>
<p>默认启动是不支持跨域的,下面我们来配置跨域。</p>
<h2 id="配置跨域">配置跨域</h2>
<ol>
<li>
<p>进入 geoserver 目录下的 lib 文件夹,将其中的</p>
<p><code>jetty-servlets-9.4.57.v20241219.jar</code>和<code>jetty-util-9.4.57.v20241219.jar</code></p>
<p>复制到 <code>geoserver/webapps/geoserver/WEB-INF/lib</code>下</p>
<p><img src="https://file.emanjusaka.com/emanjusaka/image-20251016134415366-0593459.png"></p>
</li>
</ol>
<p><img src="https://file.emanjusaka.com/emanjusaka/image-20251016134425437-0593467.png"></p>
<p>这里有文章说去别的地方去下载这两个jar 包然后放到<code>webapps/geoserver/WEB-INF/lib</code>下,这里是没必要去下载的,geoserver 中已经包含有这两个 jar包了,复制过去就好了。自己去下载还要考虑版本问题,用 geoserver 自己版本一定是兼容的。</p>
<ol start="2">
<li>
<p>修改<code>geoserver/webapps/geoserver/WEB-INF</code>目录下的 web.xml 文件</p>
<p>可以直接新增以下配置</p>
<pre><code class="language-xml">    &lt;filter&gt;
       &lt;filter-name&gt;cross-origin&lt;/filter-name&gt;
       &lt;filter-class&gt;org.eclipse.jetty.servlets.CrossOriginFilter&lt;/filter-class&gt;
       &lt;init-param&gt;
         &lt;param-name&gt;chainPreflight&lt;/param-name&gt;
         &lt;param-value&gt;false&lt;/param-value&gt;
       &lt;/init-param&gt;
       &lt;init-param&gt;
         &lt;param-name&gt;allowedOrigins&lt;/param-name&gt;
         &lt;param-value&gt;*&lt;/param-value&gt;
       &lt;/init-param&gt;
       &lt;init-param&gt;
         &lt;param-name&gt;allowedMethods&lt;/param-name&gt;
         &lt;param-value&gt;GET,POST,PUT,DELETE,HEAD,OPTIONS&lt;/param-value&gt;
       &lt;/init-param&gt;
       &lt;init-param&gt;
         &lt;param-name&gt;allowedHeaders&lt;/param-name&gt;
         &lt;param-value&gt;*&lt;/param-value&gt;
       &lt;/init-param&gt;
   &lt;/filter&gt;
    &lt;filter-mapping&gt;
      &lt;filter-name&gt;cross-origin&lt;/filter-name&gt;
      &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
    &lt;/filter-mapping&gt;
</code></pre>
<p>也可以打开 web.xml 配置文件中的注释,这些配置已经存在了只不过是被注释了。</p>
<p><img src="https://file.emanjusaka.com/emanjusaka/image-20251016135403929.png"></p>
<p><img src="https://file.emanjusaka.com/emanjusaka/image-20251016135444700.png"></p>
<p>其中一部分配置大概位置在 143 行到 162 行。剩下的在 197 行到 162 行。</p>
<p>这里要注意只需要打开通过 Jetty 配置跨域,通过 Tomcat 配置跨域不需要打开。因为我们只复制了 Jetty 相关的 jar包,如果打开了 Tomcat 的配置会因为缺少 jar 包而报错。</p>
</li>
</ol><br><br>
来源:https://www.cnblogs.com/emanjusaka/p/19158494
頁: [1]
查看完整版本: 【开发问题】GeoServer 跨域问题解决方案