如何在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, OPTIONSAccess-Control-Allow-Headers:匹配前端请求中携带的自定义头,比如Content-Type, Authorization, X-Requested-WithAccess-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
相关产品推荐
相关产品推荐

