SAP UI5 应用读取 CSRF token 的 HTTP head 请求逻辑解析
SAP UI5 应用在发送 OData batch 请求之前,会通过下列的_createBatchRequest
方法构造 batch 请求对象:
var oBatchRequest = that._createBatchRequest(aReadRequests);
该请求对象的 data 字段里,包含 batch 具体的 payload:
- Invoices?KaTeX parse error: Expected 'EOF', got '&' at position 7: skip=0&̲top=100&$orderby=ShipperName%20asc
- Invoices/$count
该请求头部字段 Accept 为 multipart/mixed:
然后通过 oWrappedBatchRequestHandle.oRequestHandle = that._submitBatchRequest(oBatchRequest, aBatchGroup, fnSuccess, fnError) 方法进行提交。
token handling 标志位为 true,且方法不为 POST,因此在执行 batch 操作之前,先要获取 CSRF token:
进入函数refreshSecurityToken
.
构造发起 token 请求的 request 对象:
url 为:https://services.odata.org/V2/Northwind/Northwind.svc/
首先尝试 head 请求,如果报错,再切换成 get 请求:
// Initially try method "HEAD", error handler falls back to "GET" unless the flag forbids HEAD request
if (this.bDisableHeadRequestForToken) {
mTokenRequest.request = requestToken("GET", handleGetError);
} else {
mTokenRequest.request = requestToken("HEAD", handleHeadError);
}
请求 token 的 HTTP 请求的 Content-type 设置逻辑,和标志位 bJson
有关:
request 对象:
最重要的头部字段 x-csrf-token
, 值被填充成 fetch:
function requestToken(sRequestType, fnError) {
// trigger a read to the service url to fetch the token
oRequest = that._createRequest(sUrl, "", sRequestType,
that._getHeaders(undefined, true), null, null, !!bAsync);
oRequest.headers["x-csrf-token"] = "Fetch";
return that._request(oRequest, handleSuccess, fnError, undefined, undefined, that.getServiceMetadata());
}
执行了 head 请求后,响应的状态码是 200,但是 responseText
字段值是空的。
还是进入 success callback:
使用 handler 读取 token 请求的 response,这个 handler 支持的 content-type 类型:application/atomsvc+xml;q=0.8, application/json;odata=fullmetadata;q=0.7, application/json;q=0.5, /;q=0.1
这里因为 response.body 是空的,因此进入不了 dispatchHandler
的处理逻辑:
然后进入 refreshToken 的 callback:
当然是拿不到 token 的:
进入 else 分支:
清除所有相关的 token 标志位:
ODataModel.prototype.resetSecurityToken = function() {
delete this.oSharedServiceData.securityToken;
delete this.oHeaders["x-csrf-token"];
delete this.pSecurityToken;
};
resolve 一个空的 token 给 callback:
这个 head 请求的响应码为 200,但是响应头部没有附带 csrf token:
相关文章
- SAP UI5 SimpleForm layout 设计的一些推荐做法
- 如何用 ABAP 代码创建 SAP CRM IBase
- 使用 SAP UI5 sap.ui.export.Spreadsheet API 进行 Excel 导出的一些限制
- SAP Spartacus HTTP Interceptor 的 provisioning 逻辑
- [ChatGPT 勘误] SAP UI5 的 sap.ui.base.Object
- 关于 SAP Gateway 响应头部 Last Modified 字段的赋值逻辑
- SAP UI5 Smart Table 和 Smart Filter Bar 的联合使用方法介绍试读版
- SAP MM 模块的入门者,想学习 ABAP 编程语言应该如何入手?
- 澄清一些对 SAP UI5 响应式表格 sap.m.Table 的常见理解误区试读版
- SAP Emarsys 的前后台技术栈
- 深入比较:SAP vs Oracle(sap和oracle)
- SAP可以创建预留的移动类型详解编程语言
- SAP 采购收货时与FICO科目的对应关系,关联点 Account Assignment Category详解编程语言
- SAP MM移动平均价和标准价逻辑详解编程语言
- SAP 屏幕逻辑流详解编程语言
- sap Merge change requests详解编程语言
- SAP ABAP MARD和MARDH计算逻辑详解编程语言
- SAP获取函数/接口输入参数、输出参数、表结构等信息详解编程语言
- SAP PI 配置soap web service详解编程语言
- 数据库解决方案如何使用SAP创建Redis数据库(sap怎么创建redis)
- 缓存使用SAP创建Redis缓存,实现高效稳定加速(sap如何创建redis)
- Oracle与SAP权衡利弊比较之路(oracle与sap比较)
- 跨界合作新模式 Oracle与SAP实现合并(oracle与sap合并)
- 展望未来Oracle与SAP的合作结盟前景(oracle、sap)
- Oracle与SAP的技术潜力比较(oracle sap比较)
- Oracle 与 SAP深度对比分析(oracle sap对比)