2017-01-16 57 views
7

我從我的node.js服務器獲取數據的問題。訪問控制允許起源問題角2

的客戶端是:

public getTestLines() : Observable<TestLine[]> { 
    let headers = new Headers({ 'Access-Control-Allow-Origin': '*' }); 
    let options = new RequestOptions({ headers: headers }); 

    return this.http.get('http://localhost:3003/get_testlines', options) 
       .map((res:Response) => res.json()) 
       .catch((error:any) => Observable.throw(error.json().error || 'Server error')); 
} 

在服務器端我還設置了頭:

resp.setHeader('Access-Control-Allow-Origin','*') 
resp.send(JSON.stringify(results)) 

但我得到一個錯誤

「的XMLHttpRequest無法加載http://localhost:3003/get_testlines 。對預檢請求的響應未通過訪問控制檢查:否 請求的 資源上存在'Access-Control-Allow-Origin'標題。因此,原產地「http://localhost:3000」不允許 訪問。」

我該如何解決呢?當我刪除頁眉它說,這個頭是必需的。

+1

您是否在使用Crome?如果是,請啓用Access-Control-Allow-Origin。 Crome有一個cors插件。對於IE,你不應該在設置標題後出現這個錯誤 –

+0

這很可能是服務器端問題。你確定你的響應實際上在'OPTIONS'請求中發送了頭文件嗎?例如,您可以嘗試郵遞員檢查標題。 – Randy

回答

6

Access-Control-Allow-Origin響應標題,而不是請求標題。

你需要有它出現的反應,而不是請求。

你試圖把它的響應:

resp.setHeader('Access-Control-Allow-Origin','*') 

...但並未奏效。

這可能是因爲你還沒有把它的響應權利請求。該錯誤消息說:

響應預檢要求沒有通過訪問控制檢查

你已經做了一些使預檢請求。這意味着在瀏覽器發出GET請求之前,它正在發出OPTIONS請求。

這是,據推測,被你的服務器上的不同代碼段太行resp.setHeader('Access-Control-Allow-Origin','*')沒有被擊中處理。導致要由預檢請求

一件事是添加請求頭(除少數例外以外)。將Access-Control-Allow-Origin添加到請求將觸發預檢請求,因此要嘗試解決該問題的第一件事是從請求中刪除以

如果失敗,那麼您需要設置您的服務器,以便它可以響應OPTIONS請求以及GET請求。

1

不要設置Access-Control-Allow-Origin的請求時,它是從來不需要在那裏。你應該仔細檢查,如果標題是出現在響應(檢查它在開發者控制檯)。如果你分享了更多的後端代碼,這將是有益的。

2

訪問控制允許來源是響應頭,不是請求頭 你需要修復的許可,您的後端。所以你必須創建包含所有必要權限的cors.js文件。

function crosPermission(){ 
    this.permission=function(req,res,next){ 
    res.header('Access-Control-Allow-Origin','*'); 
    res.header('Access-Control-Allow-Headers','Content-Type'); 
    res.header('Access-Control-Allow-Methods','GET','POST','PUT','DELETE','OPTIONS'); 
    next(); 
    } 
} 

module.exports= new crosPermission(); 

下一步 您需要添加一些線在app.js

var cors=require('./cors'); 
    app.use(cors.permission) 
-1

你可以在php頭設置爲

header("Access-Control-Allow-Origin: *"); 
header("Content-Type: application/json; charset=UTF-8");