从 80 端口到另一个端口的角度 $http 请求

Posted

技术标签:

【中文标题】从 80 端口到另一个端口的角度 $http 请求【英文标题】:angular $http request from 80 port to another port 【发布时间】:2017-07-26 09:38:39 【问题描述】:

我正在尝试使用 $http 方法从 angular 1 项目中的本地服务器上的端口 3000 访问节点 api,但我收到此错误:

XMLHttpRequest 无法加载 http://localhost:3000/login。请求头 Access-Control-Allow-Headers 不允许字段授权 预检响应。

我还在节点js中添加了Access-Control-Allow-Origin : *

req.on('end', function() 
    req.rawBody = req.rawBody.toString('utf8');
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost');
    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', '*');
    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', '*');
    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    // res.setHeader('Access-Control-Allow-Credentials', false);
    next();
);

我的角码是:

var req = 
            method: 'POST',
            url: 'http://localhost:3000/login',
            headers: 
                'Content-Type': 'application/json',
                // 'cache-control': 'no-cache'
            ,
            data:  username: username, password: password ,
            json: true
        ;

        $http(req).then(function successCallback(response)
            console.log(response);
        , function errorCallback(response)
            console.log("Error : ");
            console.log(response);
        );

但我仍然收到此错误。

【问题讨论】:

【参考方案1】:

错误出现在指定的预检响应中。 所以你需要处理 OPTIONS 方法:

req.on('end', function() 
    req.rawBody = req.rawBody.toString('utf8');
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost');

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', '*');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', '*');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    // res.setHeader('Access-Control-Allow-Credentials', false);


    if (req.method === "OPTIONS") 
        return res.status(200).end();
    

    return next();
);

这是由于浏览器处理跨域请求的方式造成的。在您的 POST 之前发送一个 OPTIONS 请求(预检)以获取允许的来源、标头和方法。

【讨论】:

以上是关于从 80 端口到另一个端口的角度 $http 请求的主要内容,如果未能解决你的问题,请参考以下文章

Elastic Beanstalk EC2 实例在端口 5000 和端口 80 上响应 http 请求

Apache 2.4 将 https 重定向到另一个端口

如果您将 dst 端口为 80 的 TCP 数据包发送到在端口 80 处提供 http 请求的主机,会发生啥?

HTTP 8种请求方式介绍

mod_rewrite - 明确请求 HTTP 时,端口 80 不会更改为 443

Angular2 http post请求到另一个端口上的nodejs服务器