You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过API访问GeoNetwork元数据遇403 CORS错误求助

解决GeoNetwork API CORS 403 Forbidden错误

问题核心原因

你在客户端请求里设置的Access-Control-Allow-Origin、Access-Control-Allow-Methods是服务器端需要返回的响应头,不是客户端请求时应该发送的。这些多余的请求头不仅没用,反而可能触发服务器的安全校验逻辑,导致403错误。


解决步骤

1. 配置GeoNetwork服务器端CORS支持

要解决跨域问题,必须在GeoNetwork的服务器端开启CORS,步骤如下:

  • 找到GeoNetwork安装目录下的web/WEB-INF/web.xml文件
  • 在文件中添加CORS过滤器配置:
<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>
    <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,PUT,DELETE,OPTIONS</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Authorization,Accept,Content-Type</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern> <!-- 对所有API路径生效 -->
</filter-mapping>
  • 保存文件后,重启GeoNetwork服务

2. 修正客户端请求代码

去掉错误的响应头设置,保留必要的请求头即可,修正后的代码:

const apiUrl = 'http://localhost:8080/geonetwork/srv/api/0.1/records?from=1&hitsPerPage=10000';

let layerObjsArr = [];

var xhr = new XMLHttpRequest();
xhr.open('GET', apiUrl);
var username = 'admin';
var password = 'admin';
var credentials = username + ':' + password;

// 仅保留必要的请求头
xhr.setRequestHeader('Authorization', 'Basic ' + btoa(credentials)); // 原生btoa替代自定义Base64.encode,确保兼容性
xhr.setRequestHeader("accept", "application/xml");

xhr.onload = function () {
    if (xhr.status === 200) {
        let xmlDoc = xhr.responseXML;
        var x = xmlDoc.getElementsByTagName("dcat:Dataset");

        for (let i = 0; i < x.length; i++) {
            let titl = x[i].getElementsByTagName("dct:title")[0].innerHTML;
            let abs = x[i].getElementsByTagName("dct:abstract")[0].innerHTML;
            let img = "";
            if (x[i].getElementsByTagName("foaf:thumbnail")[0] != undefined) {
                img = x[i].getElementsByTagName("foaf:thumbnail")[0].attributes[0].value;
            }
            let uid = x[i].getElementsByTagName("dct:identifier")[0].innerHTML;

            let layerObj = {
                title: titl,
                abstract: abs,
                thumbnail: img,
                uuid: uid,
                layer: x[i]
            }

            layerObjsArr.push(layerObj)
        }

        setLayerDetails(layerObjsArr);
    } else {
        console.log("^^^^^XHR Failed:" + apiUrl, xhr.statusText);
    }
};

// 新增错误处理逻辑
xhr.onerror = function() {
    console.log("请求发生错误", apiUrl);
};

xhr.send();

3. 额外检查点

  • 确认GeoNetwork的API版本路径正确,部分新版本API路径为/srv/api/v1/records
  • 验证用户名密码正确,且该用户拥有元数据API的访问权限
  • 开发环境可临时使用浏览器跨域插件测试,但生产环境必须依赖服务器端CORS配置

内容的提问来源于stack exchange,提问作者Masthan Patan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:37:55