进行预检复杂 CORS 请求时,headers 中应包含哪些内容?
What to include in headers when making preflight complex CORS request?
我正在制作的应用程序的 front-end 和 node-back 端分别托管(跨源)。 front-end 正在调用后端进行登录,其中 x-session-token 被发回。因为这是一个自定义 header 我理解这是一个复杂的请求,因此需要 pre-flight 检查。
在 server.js 文件中,我有以下代码片段(据我所知可以启用 CORS pre-flight 检查):
const express = require('express');
const cors = require("cors");
const app = express();
const corsOptions = {
origin: true,
credentials: true
}
app.options('*', cors(corsOptions));
front-end 进行以下 axios 调用:
axios.post('/api/user/login', logInObj,
{withCredentials:true},
{crossDomain:true},
{'Access-Control-Request-Headers': 'Content-Type'},
{'Access-Control-Request-Method': 'post'}
)
.then(logInResponse => ...
在 back-end:
中对此作出回应
router.post('/api/user/login', (request, response) => {
...
response.setHeader('Access-Control-Allow-Credentials', true);
response.setHeader('Access-Control-Allow-Headers', 'Content-Type');
response.setHeader('Access-Control-Allow-Method', 'get', 'post', 'options');
response.setHeader('Access-Control-Allow-Origin', request.get('Origin'));
response.setHeader('Access-Control-Max-Age','86400')
response.setHeader('Access-Control-Expose-Headers', 'Access-Control-Allow-Origin');
...
当我在 back-end 上控制台记录响应 header 时,它包含:
x-session-token 匹配 MySQL
Access-Control-Allow-Origin 列为 http://localhost:3000 而非通配符 (*)
但是浏览器响应的 console.log 对于 session-token 为空,这告诉我浏览器正在阻止 CORS return 数据(X-Session-Token 在这个案件)。我在请求或响应中遗漏了什么 header?
我想你错过了你想要发回的暴露的Header。
"x-session-token" ?
也尝试使用 app.use 而不是 app.options 并让 cors 包处理它,除非它只是特定于这条路线当然
app.use(cors({
credentials: true,
exposedHeaders: ['Set-Cookie', 'Content-Length', 'Accept', 'X-Requested-With', 'X-HTTP-Method-Override', 'x-session-token' ],
methods: ['GET', 'POST', 'OPTIONS', 'HEAD'],
optionsSuccessStatus: 204,
origin: 'http://localhost:3000'
})
我正在制作的应用程序的 front-end 和 node-back 端分别托管(跨源)。 front-end 正在调用后端进行登录,其中 x-session-token 被发回。因为这是一个自定义 header 我理解这是一个复杂的请求,因此需要 pre-flight 检查。
在 server.js 文件中,我有以下代码片段(据我所知可以启用 CORS pre-flight 检查):
const express = require('express');
const cors = require("cors");
const app = express();
const corsOptions = {
origin: true,
credentials: true
}
app.options('*', cors(corsOptions));
front-end 进行以下 axios 调用:
axios.post('/api/user/login', logInObj,
{withCredentials:true},
{crossDomain:true},
{'Access-Control-Request-Headers': 'Content-Type'},
{'Access-Control-Request-Method': 'post'}
)
.then(logInResponse => ...
在 back-end:
中对此作出回应router.post('/api/user/login', (request, response) => {
...
response.setHeader('Access-Control-Allow-Credentials', true);
response.setHeader('Access-Control-Allow-Headers', 'Content-Type');
response.setHeader('Access-Control-Allow-Method', 'get', 'post', 'options');
response.setHeader('Access-Control-Allow-Origin', request.get('Origin'));
response.setHeader('Access-Control-Max-Age','86400')
response.setHeader('Access-Control-Expose-Headers', 'Access-Control-Allow-Origin');
...
当我在 back-end 上控制台记录响应 header 时,它包含:
x-session-token 匹配 MySQL
Access-Control-Allow-Origin 列为 http://localhost:3000 而非通配符 (*)
但是浏览器响应的 console.log 对于 session-token 为空,这告诉我浏览器正在阻止 CORS return 数据(X-Session-Token 在这个案件)。我在请求或响应中遗漏了什么 header?
我想你错过了你想要发回的暴露的Header。 "x-session-token" ? 也尝试使用 app.use 而不是 app.options 并让 cors 包处理它,除非它只是特定于这条路线当然
app.use(cors({
credentials: true,
exposedHeaders: ['Set-Cookie', 'Content-Length', 'Accept', 'X-Requested-With', 'X-HTTP-Method-Override', 'x-session-token' ],
methods: ['GET', 'POST', 'OPTIONS', 'HEAD'],
optionsSuccessStatus: 204,
origin: 'http://localhost:3000'
})