gpt4 book ai didi

jquery - Gingerbread 浏览器跨域响应串联错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:53 24 4
gpt4 key购买 nike

我们发现 Gingerbread 默认浏览器处理跨域请求的方式与大多数其他浏览器不同。服务器代码使用所有正确的 header 访问控制 header 和 200 状态代码适本地响应 OPTIONS 调用,并响应 POST使用 200 状态代码和适当的正文进行调用。服务器是用 Node 编写的,使用 Express,并且出于本次测试的目的,它的规模非常小:

var express = require('express');
var http = require('http');

var app = express();
var server = http.createServer(app);

// middleware
app.use(express.logger('dev'));
app.use(function(req, res, next) {
var origin = req.get('origin');
if (origin) {
res.header({
'Access-Control-Allow-Origin': origin,
'Access-Control-Allow-Methods': 'GET,POST,OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Allow-Credentials': true
});
}
if (req.method === "OPTIONS")
return res.send(200);
if (req.method !== "GET" && req.method !== "POST")
return res.send(405);
next();
});
app.use(express.json());
app.use(app.router);
app.post('/the/route', function(req, res) {
res.json(200, {some: 'json object'});
});

server.listen(process.env.PORT || 3000);

当 Gingerbread 浏览器向/the/route 发出 CORS 请求时,它收到 responseText“OK{some:'json object'}”。由于我们使用的是 jQuery,并且 Content-Type 响应 header 是 application/json,因此 jQuery 由于无法解析 json 响应正文而导致请求失败。我们测试的所有其他浏览器都以 "{some:'json object'}" 响应,并按预期进行解析。

那么“OK”从何而来?

我们进一步简化了服务器,完全忽略了 app.router。也许这就是问题所在。

...
// middleware
app.use(express.logger('dev'));
app.use(function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,POST,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Credentials', true);
res.json(200, {some: 'json object'});
});

这一次,令我们惊讶的是,服务器在 Gingerbread 浏览器上响应了 "{some:'json object'}{some:'json object'}",并且 "{ some:'json object}" 在所有其他浏览器上。当然,前者仍然不是有效的 json,所以我们仍然遇到了错误。

这是怎么回事?

最佳答案

事实证明,Gingerbread(至少是我们使用的版本)自动连接了 OPTIONS 请求和 POST 请求的响应。此外,对于没有特定正文和状态代码 200 的响应,Express 会自动发送 “OK” 正文。

上面的例子让这一点变得非常明显,但我们并没有将其简化到那个程度。因此,我们正在追寻已知工作版本和失败版本之间 header 等方面最微小的差异。

关于jquery - Gingerbread 浏览器跨域响应串联错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com