如何在 CORS XMLHttpRequest Access-Control-Allow-Headers 中将 %2C 解析为逗号

Posted

技术标签:

【中文标题】如何在 CORS XMLHttpRequest Access-Control-Allow-Headers 中将 %2C 解析为逗号【英文标题】:How to parse %2C as a comma in CORS XMLHttpRequest Access-Control-Allow-Headers 【发布时间】:2019-09-21 10:09:46 【问题描述】:

有没有办法为 CORS 请求的 XMLHttpRequest 提供自定义的响应头解析器?我正在尝试使用 jQuery 发出 CORS 请求,并相信接收服务在返回 Access-Control-Allow-Headers 标头的方式上存在错误。所有允许的标题都用逗号分隔,最后两个用转义逗号分隔,%2C。这会导致我的 XMLHttpRequest 引发以下异常(不要注意源地址或目标地址,或者 X-FOO 标头,因为它们是实际值的替代品):

Access to XMLHttpRequest at 'https://service.example.com/activity' from origin 'http://client.example.com' has been blocked by CORS policy: Request header field X-FOO is not allowed by Access-Control-Allow-Headers in preflight response.

这是来自预检响应的 Access-Control-Allow-Headers 标头:

Access-Control-Allow-Headers: Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,content-type%2Cx-foo

我无权访问目标服务,有没有办法告诉 XMLHttpRequest 将 %2C 解析为预检响应标头中的普通逗号?我的 jQuery 请求如下所示:

$.ajax(
    method: method,
    url: `$endpoint/$activity`,
    crossDomain: true,
    dataType: "json",
    contentType: "application/json",
    headers: 
        "X-FOO": token
    ,
    xhrFields: 
        withCredentials: true
    
);

【问题讨论】:

【参考方案1】:

有没有办法为 CORS 请求的 XMLHttpRequest 提供自定义响应头解析器?

没有。

如果有那么你可以写一个允许你喜欢的任何标题。

【讨论】:

还有其他客户端通过 webapps 与服务器交互,没有这个问题。甚至 Curl 似乎也将 %2C 解析为逗号。真是奇怪…… CURL 不受 CORS 权限的约束 - 这些其他“webapps”可能是通过他们自己的服务器执行的请求 - 再次,不受 CORS 的约束 只有 Web 浏览器实现相同的源策略(因此 CORS,这是一种可以放宽 SOP 的技术),因此 curl 客户端首先不会解析 Access-Control-Allow-Header 标头. Curl 甚至不会以@Quentin 开头 我注意到其他客户端作为 Web 程序集(WebGL 应用程序)运行。 Web 程序集是否受 CORS 约束?

以上是关于如何在 CORS XMLHttpRequest Access-Control-Allow-Headers 中将 %2C 解析为逗号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CORS XMLHttpRequest Access-Control-Allow-Headers 中将 %2C 解析为逗号

CORS 跨域 node |XMLHttpRequest 跨域提交数据 node

如何使用凭据、HTTP 授权 (CORS) 使 XMLHttpRequest 跨域?

用于 XmlHttpRequest 的带有 WebAPI 的 CORS

CORS xmlhttprequest HEAD 方法

访问 XMLHttpRequest 已被 CORS 阻止,尝试一切仍然失败