Javascript CORS错误:飞行前响应中的访问控制允许标头不允许请求标头字段授权
我正在尝试将请求从一个本地主机端口发送到另一个本地主机端口。我在前端使用angularjs,在后端使用node 因为它是CORS请求,所以在node.js中,我使用Javascript CORS错误:飞行前响应中的访问控制允许标头不允许请求标头字段授权,javascript,angularjs,node.js,http-headers,cors,Javascript,Angularjs,Node.js,Http Headers,Cors,我正在尝试将请求从一个本地主机端口发送到另一个本地主机端口。我在前端使用angularjs,在后端使用node 因为它是CORS请求,所以在node.js中,我使用 res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH'); res.header('Access-Control-Allow-Headers',
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH');
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
在angular.js服务文件中,我使用
return {
getValues: $resource(endpoint + '/admin/getvalues', null, {
'get': {
method: 'GET',
headers:{'Authorization':'Bearer'+' '+ $localStorage.token}
}
}),
}
我得到以下错误
飞行前响应中的访问控制允许标头不允许请求标头字段授权。
请帮忙 您还必须在允许的标题中添加选项。浏览器在发送原始请求之前发送飞行前请求。见下文
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH,OPTIONS');
来源
在CORS中,使用OPTIONS方法发送飞行前请求,以便服务器能够响应是否可以使用这些参数发送请求。Access Control Request Method
标头通知服务器,作为飞行前请求的一部分,当发送实际请求时,它将使用POST请求方法发送。Access Control Request Headers
头通知服务器,当发送实际请求时,它将与X-PINGOTHER
和内容类型
自定义头一起发送。服务器现在有机会确定在这些情况下是否希望接受请求
已编辑
您可以通过使用npm软件包来避免这种手动配置。我也使用了这种方法,它清晰而简单。如果您不想安装cors库,而是想修复原始代码,那么您缺少的另一个步骤是访问控制允许源代码:*是错误的。当传递身份验证令牌(例如JWT)时,必须明确说明调用服务器的每个url。在进行身份验证令牌时不能使用“*”。这是一个API问题,如果使用Postman/Fielder向API发送HTTP请求,则不会出现此错误。对于浏览器,为了安全起见,它们总是在发送实际请求(GET/POST/PUT/DELETE)之前向API发送选项request/preflight。因此,如果请求方法是OPTION,那么不仅需要在“访问控制允许头”中添加“授权”,还需要在“访问控制允许方法”中添加“选项”。我就是这样修复的:
if (context.Request.Method == "OPTIONS")
{
context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { (string)context.Request.Headers["Origin"] });
context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Accept, Authorization" });
context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" });
context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" });
}
首先,您需要使用以下命令安装
cors
:
npm install cors --save
现在将以下代码添加到应用程序启动文件中,如(app.js或server.js
)
res.header('Access-Control-Allow-Origin','*')代码>无法与自动化标题一起使用。
只需使用以下命令启用飞行前请求:
对于使用ServiceStack后端获取此信息的任何人;将“授权”添加到允许的标题中:
Plugins.Add(新公司功能(AllowedHeader:“内容类型,授权”)代码>
添加此chrome扩展
并启用“启用访问控制-[Allow/Expose]-头”
同时在同一菜单中打开Test cors并测试所有可用选项。单击每个选项,并确保获得每个选项的成功消息(绿色)
重新加载应用程序。Cors的错误现在消失了
您需要在服务器中放置auth,在firefox中不需要此auth@ÁlvaroTouzón,我将此res.header('Access-Control-Allow-Headers','Origin,X-request-With,Content-Type,Accept,Authorization');在serverChanged res.header中('Access-Control-Allow-Methods','GET、POST、PUT、DELETE、PATCH');到res.header('Access-Control-Allow-Methods','GET、PUT、POST、DELETE、OPTIONS');仍然不工作。标题('Access-Control-Expose-Headers','Authorization')//必须公开,以便浏览器具有访问此标题的权限我提供的解决方案对我有效。这对你有用吗?如果没有,你也可以试试。我也用过这个方法,它清晰简单。以前的解决方案不起作用,让我试试这个。试过npmjs.com/package/cors。“在传递身份验证令牌(例如JWT)时,必须明确说明调用服务器的每个url。在进行身份验证令牌时,不能使用“”。*-这是错误的。你凭什么这么说?
var express = require('express');
var app = express();
var cors = require('cors');
var bodyParser = require('body-parser');
//enables cors
app.use(cors({
'allowedHeaders': ['sessionId', 'Content-Type'],
'exposedHeaders': ['sessionId'],
'origin': '*',
'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
'preflightContinue': false
}));
require('./router/index')(app);
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
app.options('*', cors())