Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CORS错误:飞行前响应中的访问控制允许标头不允许请求标头字段授权_Javascript_Angularjs_Node.js_Http Headers_Cors - Fatal编程技术网

Javascript CORS错误:飞行前响应中的访问控制允许标头不允许请求标头字段授权

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',

我正在尝试将请求从一个本地主机端口发送到另一个本地主机端口。我在前端使用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', '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())