2017-05-07 43 views
0

我試圖通過以下方式提交HTML Form已成功提交表單並且沒有「Access-Control-Allow-Origin」控制檯錯誤

  • 單個演示HTML文件。 - 它的工作原理(沒有錯誤和HTTP 200響應代碼)
  • 使用Chrome郵差插件提交表單 - 它的工作原理(沒有錯誤和HTTP 200響應

但是,當我試圖提交相同的形式。

  • 使用Angular2 - 表單提交成功(有錯誤和HTTP 200響應代碼)

以下是錯誤

XMLHttpRequest cannot load https://docs.google.com/forms/d/e/1FAIpQLSfXzWPpI4X9ghY_6p5ghJRt6DC80FnrKqlw8lUg-OT-bKzBeg/formResponse. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.

我發現像123一些類似的問題在SO,我現在知道錯誤是不相關的Angular2。

我的問題是有2個部分。

  1. 如果這一點是必須固定在服務器端,爲客戶順利訪問,然後直接從HTML文件和送信的插件提交時如何工作?
  2. 當使用Angular2提交時,雖然在控制檯中有Access-Control-Allow-Origin錯誤,但表單成功提交了HTTP響應代碼200,我該如何理解這一點,爲什麼200響應代碼,如果有錯誤呢?

這是我的angular2代碼,可能是有問題嗎?

this._http 
.post(this.postUrl, data) 
.subscribe(data => { 
    console.log('Congrats your feedback is recorded...'); 
    // this is not printed in console.log so far 
}, error => { 
    console.log(error.json()); 
    // No 'Access-Control-Allow-Origin' header is present on the requested resource. 
}); 

回答

1

這不是一個服務器端問題本身。服務器只是選擇不允許來自你的域的跨域請求(或者甚至沒有考慮允許它們)。

的問題是,除非服務器允許,瀏覽器拒絕發送AJAX請求在服務器上不同的域。這是由瀏覽器實現的CORS規範所要求的。

古典形式不使用AJAX,因此工作正常。

Chrome插件不受與從服務器加載的傳統HTML頁面相同的CORS限制,因此工作正常。

0

根據瀏覽器策略在瀏覽器中不允許使用CORS。但是,這些限制不適用於POSTMAN。因此它應該被固定在後端不在前端。

記住:

  • 如果您是從本地主機請求:4200爲localhost:4200/API CORS不會發生。
  • CORS錯誤只發生在不同的服務器請求時。

    如何解決這些問題?

    1. 考慮如果您使用express作爲您的後端。
    2. 您應該添加中間件來訪問您的路線。

app.use(function(req,res,next){ 
 
    res.header('Access-Control-Allow-Origin', '*'); 
 
    //res.header('Access-Control-Allow-Headers','authorization'); 
 
    next(); 
 
});

相關問題