Angular js - GET请求中阻止的跨源请求

时间:2017-04-17 05:56:15

标签: javascript angularjs cors

我有一个键值对的列表,我在名为accessUrl的函数中访问它们。我们点击的网址是外部网址,而不是由我们维护,即我无法更改服务器代码,这些代码会从这些网址发回回复信息

成功的

http.get()给了我状态和回应。

var accessUrl = function(){
  $.each(url, function(key, value)
  {
      $http.get(value).success(function(response,status){

      $scope.status=status;
      if($scope.status == "200"){
           versionMap[key]=response.version;
           setColor[key]='color-green';
           //console.log("map "+versionMap[key]);
        }
    })//end of success

       .error(function(err){
          versionMap[key]="Down";
          setColor[key]='color-red';
        })//end of error
  })//end of each loop
}//end of accessUrl

我正在尝试制作交叉来源请求。目前我已将Chrome扩展程序添加到Chrome。

我的app.js:

var express = require("express");
var app     = express();
var path    = require("path");

app.use("/", express.static(__dirname));

app.get('/',function(req,res){
  res.sendFile(path.join(__dirname+'/index.htm'));
  //__dirname : It will resolve to your project folder.
});

app.set('port', process.env.PORT);
console.log(port);

我不想再使用CORS扩展了。没有扩展名,我遇到了以下错误:

  

阻止跨源请求:同源策略禁止读取   https://myurl.com处的远程资源(原因:CORS标头   “Access-Control-Allow-Origin”缺失。)

我们是否有办法在Angular中编写代码来制作CORS请求或任何其他方法?

我已经完成了建议的答案:

然而,我无法弄清楚需要什么。

4 个答案:

答案 0 :(得分:0)

将这些标头添加到您的节点js服务器

var express = require("express");
 var app = express();
 var path = require("path");

 app.use("/", express.static(__dirname));

 app.get('/', function(req, res) {
     res.sendFile(path.join(__dirname + '/index.htm'));
     //__dirname : It will resolve to your project folder.
 });

 app.use(function(req, res, next) {

     // Website you wish to allow to connect
     res.setHeader('Access-Control-Allow-Origin', '*');

     // Request methods you wish to allow
     res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

     // Request headers you wish to allow
     res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

     // 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', true);

     // Pass to next layer of middleware
     next();
 });

 app.set('port', process.env.PORT);
 console.log(port);

答案 1 :(得分:0)

首先在配置中注入httpProvider,然后在app.js中包含以下行

$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

它会像魅力一样发挥作用。

答案 2 :(得分:0)

您可以在服务器中使用cors库,之后您不需要在GET/POST个请求中添加/发送任何特殊标题,只需在文件中添加以下两行: 方法1:

var cors = require('cors');
app.use(cors());

使用npm安装后:

npm install cors --save

<强>方法2:

如果您不想使用其他库,可以在服务器文件中手动添加标题:

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header('Access-Control-Allow-Methods', 'DELETE, PUT', 'GET', 'POST');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

方法3:

如果你不想编辑服务器端代码直到开发过程,你可以使用这个CORS chrome extension完美地完成工作。 P.S:您可能必须禁用它才能访问google / youtube等其他网站。

答案 3 :(得分:0)

外部API需要提及哪个来源可以调用API。如果您的域名未在外部API中定义,则无法访问API。这是安全功能。解决此问题的唯一方法是让外部API提供商允许您的主机名。

这可以使用&#39; Access-Control-Allow-Origin&#39;头。您的外部API必须使用&#39; Access-Control-Allow-Origin&#39;发送标题。作为键,主机名作为值。没有其他方法可以绕过这个。