SAP的CORS启用
文章目录
参考
参考Blog:How to Enable CORS on SAP NetWeaver Platform - Dong Pan && comment by Achim Braemer(除了blog本身,还可以关注下Achim Braemer的评论建议)
参考文档:SAP Help Portal : Editing Whitelists and No-Log Lists (CORS)
参考文档:在低于 7.52 版的 SAP NetWeaver 上启用 CORS
在高版本【7.52以及更高版本】
相关TCODE:RZ11、UCONCOCKPIT、SMICM
配置
1. 配置允许CORS参数
如果这个参数没有设置,那么所有的跨域请求都将被系统直接过滤,无法捕获
在 RZ11 修改参数 icf/cors_enabled 值为1
注意:通过动态方式修改的参数值会在服务器重启之后重置
2. 开启CORS
开启白名单场景
进入 UCONCOCKPIT,选择 HTTP白名单场景 (Http White-List Scenario)
首次开启会**该场景
如果要撤销,通过左上角的 「HTTP白名单」 - 「还原旧配置」 ,然后会删除**配置
开启CORS的 「 活动检查 」 模式
然后开启 「 活动检查 」
规则配置
之后可以双击CORS行进入配置白名单规则
但是为了方便,可以先产生一个跨域请求,系统就会捕获这个请求,针对这个请求,可以自动创建匹配白名单规则
选择未覆盖的规则,然后点击 「至白名单」
或者直接在右边「白名单」区域新建规则
前端调用CORS代码
用jquery调用会很简单
let xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
console.log("xhr.readyState : " + xhr.readyState);
if (xhr.readyState == 4) {
console.log("xhr.status : " + xhr.status);
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
console.log("xhr.responseText : " + xhr.responseText)
alert("收到消息:" + xhr.responseText);
}
else {
return "Req is unsuccessful : " + xhr.status;
}
}
}
xhr.open("POST", "$$请求地址$$");
xhr.setRequestHeader("Authorization","$$Basic basic基础验证串$$")
xhr.send();
其他辅助补充
查看连接请求
SMICM
一次ajax请求,产生两次请求的原因
允许跨域资源共享(CORS)携带 Cookie,该文章介绍了CORS请求携带cookie信息的设置方式,同时也阐述了为什么有的CORS请求会产生两次请求。
在此之前需要了解什么是 简单跨域请求 ,需求满足以下条件:
- Method只允许:GET/HEAD/POST
- Headers只允许出现 :
- Content-Type
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type只允许 :
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
不满足上述条件的即 复杂跨域请求 ,会在正式请求前发出一个Method为OPTIONS的 预请求(preflight request)
用参考文章中的内容表示这个请求:
在低于 7.52 版的 SAP NetWeaver 上启用 CORS
参考文档:在低于 7.52 版的 SAP NetWeaver 上启用 CORS以下内容系拷贝
先决条件
必须更新到 SAP 内核 7.49 PL 315 或更高版本。
背景信息
注意
如果 SAP BW 架构是在 SAP Web Dispatcher 背后运行,则应将这些更改应用到SAP Web Dispatcher服务器,而不是 ABAP。
过程
1. 在 ABAP 服务器上创建新文件。
此文件将包含 CORS 重写规则。例如,/usr/sap//SYS/profile/<cors_rewrite>。
2. 调整 ICM 参数来指向在步骤 1 中创建的文件。
可以在 ABAP 服务器的 SAP 配置文件参数设置中找到此参数。
例如,
icm/HTTP/mod_0 = PREFIX=/,FILE=<Path_To_CORS_Rewrite_File>
注意
使用创建的 CORS 重写文件的路径替换 <Path_To_CORS_Rewrite_File>。
3. 在重写文件中添加以下内容:
if %{HEADER:isSACOriginAllowed} = true
setHeader isSACOriginAllowed false
if %{HEADER:ORIGIN} regimatch ^(https:\/\/)?<HOSTNAME> [AND]
if %{PATH} regimatch (\/sap(\(.*\))*\/bw\/ina\/*)
setHeader isSACOriginAllowed true
if %{HEADER:isSACOriginAllowed} = true [AND]
if %{REQUEST_METHOD} regimatch (GET|POST)
begin
setResponseHeader Access-Control-Allow-Origin %{HEADER:ORIGIN}
setResponseHeader Access-Control-Expose-Headers x-csrf-token,sap-rewriteurl,sap-url-session-id,sap-perf-fesrec,sap-system
setResponseHeader Access-Control-Allow-Credentials true
setResponseHeader Vary origin
end
if %{HEADER:isSACOriginAllowed} = true [AND]
if %{REQUEST_METHOD} stricmp OPTIONS
begin
regRewriteUrl ^/(.*) /sap/public/ping
setResponseHeader Access-Control-Allow-Origin %{HEADER:ORIGIN}
setResponseHeader Access-Control-Allow-Methods GET,POST
setResponseHeader Access-Control-Allow-Headers x-csrf-token,x-sap-cid,authorization,mysapsso2,x-request-with,sap-rewriteurl,sap-url-session-id,content-type,accept-language
setResponseHeader Access-Control-Max-Age 600
setResponseHeader Access-Control-Allow-Credentials true
setResponseHeader Vary origin
removeResponseHeader Set-Cookie
removeResponseHeader Expires
end
注意
使用 SAP Analytics Cloud 主机替换 。例如,mytenant.us1.sapanalytics.com。
注意
可以将多个主机添加到重写文件。有关详细信息,请参阅如何在 SAP NetWeaver 平台上启用 CORS。