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

如何在OData服务中启用CORS策略?跨域AJAX请求报错解决

SAP OData服务跨域报错:预检请求未返回OK状态,如何配置CORS?

我创建了带有jQuery AJAX请求函数的简单HTML页面,用于调用OData服务获取响应。已在前端设置所有请求头并启用CORS,但仍出现跨域报错。报错信息如下:

Access to fetch at 'http://x.x.x.xxx:xxxx/sap/opu/odata/SAP/ZFI_M_SRV_01/ZFI_MSet' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

请问需在OData服务的何处配置启用CORS策略?


解决方案

你的报错核心是OPTIONS预检请求未返回200 OK状态,需要在SAP OData服务的网关层、代码层或Web Dispatcher层配置CORS规则,以下是具体操作:

1. SAP网关ICF节点配置

  • 登录SAP系统,打开事务码SICF,定位到你的OData服务对应的ICF节点(路径通常为/sap/opu/odata/SAP/你的服务名称)
  • 双击进入节点配置,切换到错误页标签页,找到处理选项区域,确认已勾选允许OPTIONS请求方法
  • 切换到响应头标签页,添加以下CORS相关响应头:
    • Access-Control-Allow-Origin:设置允许跨域的源,可填*(允许所有源)或指定具体前端域名
    • Access-Control-Allow-Methods:填写允许的HTTP方法,比如GET, POST, PUT, DELETE, OPTIONS
    • Access-Control-Allow-Headers:匹配前端请求中携带的自定义头,比如Content-Type, Authorization, X-Requested-With
    • Access-Control-Max-Age:设置预检请求的缓存时长,比如3600(单位秒)

2. OData服务ABAP代码增强

如果网关层配置后仍未解决,需要在OData服务的DPC_EXT类中手动处理OPTIONS请求:

  • 打开事务码SE24,找到你的服务对应的Z*DPC_EXT类(比如ZFI_M_SRV_01_DPC_EXT)
  • 重定义接口方法IF_ODATA_APPLICATION_EXTENSION~HANDLE_REQUEST
  • 添加如下代码,直接对OPTIONS请求返回200状态码并设置CORS头:
METHOD if_odata_application_extension~handle_request.
  DATA(lo_http_request) = io_request->get_http_request( ).
  DATA(lo_http_response) = io_response->get_http_response( ).

  " 处理OPTIONS预检请求
  IF lo_http_request->get_method( ) = 'OPTIONS'.
    lo_http_response->set_status( 200 ).
    lo_http_response->set_header_field( name = 'Access-Control-Allow-Origin' value = '*' ).
    lo_http_response->set_header_field( name = 'Access-Control-Allow-Methods' value = 'GET, POST, PUT, DELETE, OPTIONS' ).
    lo_http_response->set_header_field( name = 'Access-Control-Allow-Headers' value = 'Content-Type, Authorization' ).
    lo_http_response->set_header_field( name = 'Access-Control-Max-Age' value = '3600' ).
    RETURN.
  ENDIF.

  " 执行原有业务逻辑
  super->if_odata_application_extension~handle_request( io_request = io_request io_response = io_response ).
ENDMETHOD.
  • 激活类后重新测试请求

3. SAP Web Dispatcher配置(若使用)

如果前端请求经过SAP Web Dispatcher,需要在其配置文件中添加CORS规则:

  • 打开Web Dispatcher的profile配置文件,找到icm/HTTP/mod_0参数,添加以下规则:
icm/HTTP/mod_0 = PREFIX=/,FILE=$(DIR_PROFILE)/cors_rules.txt
  • 在cors_rules.txt文件中写入:
SetHeader Access-Control-Allow-Origin *
SetHeader Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS
SetHeader Access-Control-Allow-Headers Content-Type,Authorization
  • 重启Web Dispatcher使配置生效

内容的提问来源于stack exchange,提问作者Raja Chohan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:00:04