Cross-Origin Resource Sharing (CORS)
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:
<bean id="extnamePlatformFilterChain" class="de.hybris.platform.servicelayer.web.PlatformFilterChain">
<constructor-arg>
<list>
<ref bean="corsFilter"/>
[...]
</list>
</constructor-arg>
</bean>
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过滤器配置,则必须添加以下属性:
corsfilter.commercewebservices.allowedOrigins=*
corsfilter.commercewebservices.allowedMethods=GET HEAD OPTIONS PATCH PUT POST DELETE
corsfilter.commercewebservices.allowedHeaders=origin content-type accept authorization cache-control x-anonymous-consents x-profile-tag-debug x-consent-reference occ-personalization-id occ-personalization-time
corsfilter.commercewebservices.exposedHeaders=x-anonymous-consents occ-personalization-id occ-personalization-time
corsfilter.commercewebservices.allowCredentials=true
Commerce Cloud Manifest Configuration
如果您使用 Commerce Cloud 清单文件安装 CORS 过滤器配置,请将以下标头添加到清单文件:
{
"key": "corsfilter.commercewebservices.allowedOrigins",
"value": "*"
},
{
"key": "corsfilter.commercewebservices.allowedMethods",
"value": "GET HEAD OPTIONS PATCH PUT POST DELETE"
},
{
"key": "corsfilter.commercewebservices.allowedHeaders",
"value": "origin content-type accept authorization cache-control x-anonymous-consents x-profile-tag-debug x-consent-reference occ-personalization-id occ-personalization-time"
},
{
"key": "corsfilter.commercewebservices.exposedHeaders",
"value": "x-anonymous-consents occ-personalization-id occ-personalization-time"
}
{
"key": "corsfilter.commercewebservices.allowCredentials",
"value": "true"
}
Impex
如果您想在初始化期间、更新期间或使用 Hybris 管理控制台手动安装 CORS 过滤器配置,您可以使用以下 ImpEx 脚本。
INSERT_UPDATE CorsConfigurationProperty;key[unique=true];value;context[default=commercewebservices,unique=true]
;allowedOrigins;*
;allowedMethods;GET HEAD OPTIONS PATCH PUT POST DELETE
;allowedHeaders;origin content-type accept authorization cache-control x-anonymous-consents x-profile-tag-debug x-consent-reference occ-personalization-id occ-personalization-time
;allowCredentials;true
;exposedHeaders;x-anonymous-consents occ-personalization-id occ-personalization-time
更多Jerry的原创文章,尽在:"汪子熙":
网友评论