Express - 无法发送重定向,对预检请求的响应未通过访问控制检查

Posted

技术标签:

【中文标题】Express - 无法发送重定向,对预检请求的响应未通过访问控制检查【英文标题】:Express - Can't send redirect, Response to preflight request doesn't pass access control check 【发布时间】:2018-01-19 10:20:58 【问题描述】:

尝试将用户重定向到登录页面时,我总是收到此错误:

对预检请求的响应未通过访问控制检查: 响应中“Access-Control-Allow-Origin”标头的值必须 当请求的凭据模式为时,不是通配符“*” '包括'。因此,Origin 'null' 不允许访问。这 XMLHttpRequest 发起的请求的凭证模式是 由 withCredentials 属性控制。

在我的 express 应用程序中,我已经实现了 CORS:

var corsOptions = 
  origin:  'http://localhost:4200',
  credentials: true


app.use(cors(corsOptions));

然后我尝试重定向用户:

router.use(function(req,res,next)
    if((req.session.user == null)
        res.redirect('http://localhost:4200' + '/login')
    
    else
        next();
);

在 Angular 4 上,我使用 withCredentials : true 发送所有请求,因为我使用的是 cookie;

这些是请求/响应标头:

回复:

访问控制允许凭据:true 访问控制允许来源:http://localhost:4200 连接:保持活动日期:2017 年 8 月 10 日星期四 12:09:55 GMT 地点:http://localhost:4200/login 设置cookie:semanaintegrada.session=s%3A6nieAv1pfn2V-2x7H4HbnqJFbYsgJmwy.hO1QKm%2Fgm6Kmso8pLCQ5zrZAVNhIYgfr%2BgzOB0oI9UA; 路径=/;过期=2017 年 8 月 10 日星期四 13:09:55 GMT Transfer-Encoding:chunked Vary:Origin X-Powered-By:Express

请求:

Accept:application/json, text/plain, / Accept-Encoding:gzip, deflate, br 接受语言:pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4 缓存控制:无缓存连接:保持活动内容长度:39 内容类型:应用程序/json Cookie:semanaintegrada.session=s%3AwuiVwYs3Ahs4dfLULfpqMBcrnbthY7sZ.OYZk%2FCnZGHAe8v1T8nWpbAdFQVsXjUFAQxnYI27%2FZlE 主机:localhost:3000 来源:http://localhost:4200 Pragma:no-cache 引用者:http://localhost:4200/ User-Agent:Mozilla/5.0 (Windows NT 10.0; WIN64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/60.0.3112.90 Safari/537.36

此外,在 Chrome 中创建了 4 个请求(我不知道为什么)。 3 到我的快递应用 和 1 到 localhost:4200 最后一个有 Access-Control-Allow-Origin:* 和 Origin null 这有关系吗?

【问题讨论】:

【参考方案1】:

“凭据标志” 指的是发出请求的 XMLHttpRequest.withCredentials,而不是 Access-Control-Allow-Credentials 标头。

如果请求的withCredentialstrue,则Access-Control-Allow-Origin: *不能使用,即使没有Access-Control-Allow-Credentials header.

【讨论】:

但是我仍然需要发送'withCredentials'参数,因为我需要在我的请求中使用cookies,我该怎么办?

以上是关于Express - 无法发送重定向,对预检请求的响应未通过访问控制检查的主要内容,如果未能解决你的问题,请参考以下文章

从源 xxxx 访问 XMLHttpRequest ' 被 CORS 策略阻止:对预检的响应。预检请求不允许重定向

302 在 CORS 预检请求到 nodejs 服务器后重定向

ASP.NET Core Web API + Angular 对预检请求的响应未通过访问控制检查:预检请求不允许重定向

某些 GET 请求对预检的 Angular2 响应无效(重定向)

在 axios 发布请求后使用 express 进行重定向

如何解决“预检无效(重定向)”或“预检请求不允许重定向”