CORS 是 Web 上的一种标准机制,它使来自 Web 应用程序的跨域请求能够到达不同域上的服务器。 只要响应中没有所需的 HTTP 标头,浏览器就会阻止跨源请求。
响应标头由服务器指定,这就是为什么必须设置服务器以生成正确的标头的原因。 在 SAP Commerce Cloud 后端,可以使用 CorsFilter 以通用方式配置这些标头。 可以使用项目属性为每个节点配置此属性,或者可以使用 ImpEx 安装脚本安装到每个节点。
SAP Commerce 支持跨域资源共享机制。 CORS 机制为浏览器和服务器定义了一种方式,可以决定允许或不允许对受限资源的跨域请求。
想象一下 http://www.example.com/somepage.html 上的脚本想要从 https://www.example.com:87/resources 访问资源。 您的浏览器将这两个地址视为两个不同的来源,它将阻止 /somepage.html 脚本从 /resources 获取资源。 通过以接受 /somepage.html 请求的方式准备 CORS 配置,可以安全地放宽此限制。
Enabling CORS Support in SAP Commerce Extensions
要在 SAP Commerce 扩展中启用 CORS 支持,请将这些部分包含在所选扩展的 [extname]-web-spring.xml 文件中。
extname-web-spring.xml:
Configuring CORS in SAP Commerce Web Applications
Global Cluster Configuration
CORS 配置存储在 CorsConfigurationProperty 项内的数据库中。 它是全局的,适用于连接到集群的所有节点。
要编辑您的配置,请在后台转到系统 CORS 过滤器 CorsConfigurationProperty 并创建或修改 CorsConfigurationProperty 类型的实例。CORS Headers
allowedOrigins
在开发中,允许的来源通常用星号 (*) 配置,这会将所有客户端列入许可名单,无论其域如何。 在生产环境中,这应该包含允许与后端 API 交互的不同域。
allowedMethods
允许的标头必须包括所有允许使用的 HTTP 方法。 对于斯巴达克斯,需要配置以下方法:
GET HEAD OPTIONS PATCH PUT POST DELETE
allowedHeaders
allowed headers 设置指示允许跨域请求的 HTTP 标头。如果这些标头不允许跨域,Spartacus 将不会收到特定请求的响应。大多数标头是标准标头,但您可能需要一些特定于功能的标头。以下列表提供了可以使用的所有标头的概述。allowCredentials
请求凭证(Request credentials)与 cookie、授权标头或 TLS 客户端证书有关。默认情况下,这些在跨域请求中是不允许的,这就是为什么在未应用配置时请求会被阻止的原因。
在 Spartacus 库的 1.x 版中,Spartacus 没有发送 cookie,但从 2.0 版开始,将为每个 OCC 请求发送 cookie。这也已修补到 Spartacus 库的 1.4 和 1.5 版。
需要发送 cookie 才能获得“会话亲和力”,也称为“粘性会话”。会话亲和性意味着 API 端点后面的同一服务器用于同一会话的所有后续请求。尽管 Commerce API 是无状态的,但有时多个并行或顺序调用可能会失败。例如,“添加到购物车”请求后跟“加载购物车”请求可能会失败,因为第一个请求可能会在服务器 1 上结束,而紧随其后的第二个请求可能会在服务器 2 上结束。服务器可能不够快,无法发送缓存失效,这就是为什么第二个响应可能无法捕获添加的项目。
会话亲缘关系的另一个优点是,如果对同一会话的请求由同一服务器提供服务,则后端将获得性能改进。
为此,CCv2 公开了一个响应 cookie (ROUTE),指示用于处理 API 请求的处理服务器。每当客户端将此 cookie 添加到下一个请求中时,该请求由同一服务器处理。
Setting Up CORS
后端需要的各种CORS配置可以通过以下方式安装:
使用配置属性(configuration properties)在部署期间安装它们
在部署期间使用 Commerce Cloud 清单文件(manifest.json)安装它们
使用 ImpEx 脚本在运行时安装它们
使用 Backoffice 在运行时手动配置它们
OCC 由名为 commercewebservices 的模板扩展(template extension)安装。 但是,您可以重命名扩展 Web 应用程序路径,或从中生成自定义扩展。 在下一节的示例中,我们假设名称为 commercewebservices,但如果您有自定义名称,则应替换它。
大多数配置仅适用于 OCC,但如果您使用其他 API(例如辅助服务模块),您还需要为这些 API 配置 CORS。
Project Properties File
如果按属性安装CORS过滤器配置,则必须添加以下属性:
Commerce Cloud Manifest Configuration
如果您使用 Commerce Cloud 清单文件安装 CORS 过滤器配置,请将以下标头添加到清单文件:
Impex
如果您想在初始化期间、更新期间或使用 Hybris 管理控制台手动安装 CORS 过滤器配置,您可以使用以下 ImpEx 脚本。