簡體   English   中英

請求的資源中不存在“Access-Control-Allow-Origin”標頭

[英]No 'Access-Control-Allow-Origin' header is present on the requested resouce

我正在編寫使用 Angular 作為客戶端和 NodeJs 作為后端的應用程序。 我用 iis 和 iisnode 托管我的應用程序。

最近我在我的應用程序中添加了 Windows 身份驗證,這樣我就可以知道哪個用戶登錄了。

大多數請求都可以正常工作,但是我遇到了從另一條路由 (/manage) 但來自同一來源的請求的授權問題。

我的角度代碼:

var url = "http://localhost:15001/auth/"+entredPass;
this.http.get(url, {withCredentials: true}).subscribe(res => {
    ...
});

我的 NodeJs 代碼:

var app = express();
var allowCrossDomain = function (req, res, next){
    res.header('Access-Control-Allow-Origin', origin); //Gets that from config
    res.header('Access-Control-Allow-Credentials', true);
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');

    if(res.method == 'OPTIONS')
        res.send(200);
    else
        next();
}
app.use(allowCrossDomain);

//This request works
app.get('isAlive', function(req, res){
    res.setHeader('Access-Control-Allow-Origin', origin); //Gets that from config
    res.status(200);
    res.send(true);
});

//This one isn't - why?
app.get('/auth/:password', function (req, res){
    ...
    var authRes = false;
    if (password == "123456")
        authRes = true;

    res.setHeader('Access-Control-Allow-Origin', origin);
    res.status(200);
    res.send(authRes.toString());
});

對於第二個 GET 我得到錯誤:

請求的資源上不存在“Access-Control-Allow-Origin”標頭。 因此不允許訪問源 ' http://myurl '。

這兩個請求之間的唯一區別是第一個是從“ http://myurl ”調用的,第二個是從“ http://myurl/manage ”調用的。 雖然當我查看瀏覽器的網絡選項卡時,我看到失敗請求的來源是“ http://myurl ”。

為什么沒有顯示“訪問控制允許來源”,我該如何解決? 謝謝你。

你可以這樣做。

CORS 是一個 node.js 包,用於提供 Connect/Express 中間件,可用於通過各種選項啟用 CORS。

1安裝cors

npm install cors

2然后在您的 Express 應用程序中使用它。

const express = require('express');
const cors = require('cors');
const app = express();

app.use(cors());

//This request works
app.get('isAlive', function(req, res) {
  res.setHeader('Access-Control-Allow-Origin', origin); //Gets that from config
  res.status(200);
  res.send(true);
});

//This one isn't - why?
app.get('/auth/:password', function(req, res) {
  ...
  var authRes = false;
  if (password == "123456")
    authRes = true;

  res.setHeader('Access-Control-Allow-Origin', origin);
  res.status(200);
  res.send(authRes.toString());
});

3或者,如果您想,您還可以將特定域列入白名單:

const whitelist = ['http://example1.com', 'http://example2.com']
const corsOptions = {
  origin: function (origin, callback) {
    if (whitelist.indexOf(origin) !== -1) {
      callback(null, true)
    } else {
      callback(new Error('Not allowed by CORS'))
    }
  }
}

app.use(cors(corsOptions));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM