2016-06-14 242 views
7

我發出一個POST請求,請求剛好位於待處理狀態,直到最終失敗。我監視了nginx日誌和節點服務器日誌,並且請求甚至沒有註冊。除另一個同事之外,這對其他任何人都有效。如果我使用邊緣瀏覽器或其他計算機,它可以正常工作。僅適用於Chrome和Firefox的選項(失敗)

我試圖向其他(自定義)服務器發出POST請求,並且它也掛在選項上。我也使用jQuery發出了POST請求,並且它以相同的方式失敗。

也許值得注意的是,我正在使用withCredentials標誌。

頁眉:

Provisional headers are shown 
Access-Control-Request-Headers:content-type 
Access-Control-Request-Method:GET 
Origin:http://localhost:8080 
Referer:http://localhost:8080/<path> 
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36 

請求:

public login(user) { 
    const endpoint = `http://<url>`; 

    let headers = new Headers(); 
    headers.append('Content-type', 'application/json'); 

    return this.http 
     .post(endpoint, JSON.stringify(user), { 
     headers: headers, 
     }); 

    } 

我訂閱我的組件調用:

this._accountService.login(this.user) 
     .subscribe(res => { 
      console.log("logged in!"); 
      if (res.json().status === "success") { 
       window.location.href = `/home/${this.org}/${this.product}`; 
      } 
      else { 
       // What other options are there? 
       console.log("Do something else maybe?"); 
      } 
     }, 
     err => { 
      this.invalidLogin = true; 
      console.log("Ye shall not pass!"); 
     }); 

成功的用戶的頭部

Accept:*/* 
Accept-Encoding:gzip, deflate, sdch 
Accept-Language:en-US,en;q=0.8 
Access-Control-Request-Headers:content-type 
Access-Control-Request-Method:POST 
Connection:keep-alive 
Host:<url> 
Origin:<url> 
Referer:<url> 
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.33 Safari/537.36 

將Chrome://網內部/#事件

t=61869793 [st= 0] +REQUEST_ALIVE [dt=60162] 
         --> has_upload = false 
         --> is_pending = true 
         --> load_flags = 34624 (DO_NOT_SAVE_COOKIES | DO_NOT_SEND_AUTH_DATA | DO_NOT_SEND_COOKIES | MAYBE_USER_GESTURE | VERIFY_EV_CERT) 
         --> load_state = 14 (WAITING_FOR_RESPONSE) 
         --> method = "OPTIONS" 
         --> net_error = -1 (ERR_IO_PENDING) 
         --> status = "IO_PENDING" 
         --> url = "<url>" 
t=61929955 [st=60162] -HTTP_STREAM_PARSER_READ_HEADERS 
         --> net_error = -324 (ERR_EMPTY_RESPONSE) 
t=61929955 [st=60162] -HTTP_TRANSACTION_READ_HEADERS 
         --> net_error = -324 (ERR_EMPTY_RESPONSE) 
t=61929955 [st=60162] -URL_REQUEST_START_JOB 
         --> net_error = -324 (ERR_EMPTY_RESPONSE) 
t=61929955 [st=60162] URL_REQUEST_DELEGATE [dt=0] 
t=61929955 [st=60162] -REQUEST_ALIVE 
         --> net_error = -324 (ERR_EMPTY_RESPONSE) 

我真的猜這是關係到的東西,在我的瀏覽器(一個或多個),但我緩存真的找不到什麼。我已經清除了所有可以存儲的cookies和任何東西。我還可以在哪裏檢查以清除事情?這顯然是我的電腦/瀏覽器(和另一個不幸的人)的本地東西。

+0

http://stackoverflow.com/questions/10143093/origin-is-not-allowed-by-access-control-allow-origin –

+0

這與Angular無關。您正在訪問的服務器需要支持CORS請求。 'OPTIONS'是瀏覽器自主進行的預檢請求。如果它沒有返回預期的'Access-Control-Allow -...'標頭,它甚至不會嘗試發送實際的請求。 –

+0

@GünterZöchbauer我啓用了CORS。該請求適用於其他計算機和瀏覽器。 – Aarmora

回答

2

請嘗試訂閱()到observable。

return this.http 
    .post(endpoint, JSON.stringify(user), { 
    headers: headers, 
    }).subscribe(() => console.log("POST done!")); 
+0

對不起,這只是我的服務,這是我的組件調用。我的組件已訂閱。我應該澄清一點。 – Aarmora

+0

@Aarmora您是否嘗試過進入後期調用以查看它執行的最後一步是什麼? – zpul

+0

它會進行完整的調用,但請求只是掛起。由於連接被拒絕,所以沒有回叫。 – Aarmora

1

您是否嘗試過在頭文件中設置'Cache-Control'?我認爲在jQuery的你可以簡單地設置

$.ajax({  
    cache: false 
}); 

或定期Ajax請求添加頭部

request.setRequestHeader("Cache-Control", "no-cache"); 
+0

我沒有聽說過這個。我只是嘗試它,並沒有得到不同的結果。好的建議,但。 – Aarmora

1

沒有與CORS問題和使用localhost作爲域(已在原產地已上市頭)。通常,由於某些安全原因,當涉及localhost時,CORS/OPTIONS請求無法正常工作,但掛起通常不會發生,所以這可能不是正確答案,但它值得一試!

嘗試將新主機添加到本地計算機並從等式中刪除localhost。只是把這個想法拋出去,並希望它可以幫助你!

按照下面的評論

你的服務器似乎允許的連接,但它不會出現發送響應。您是否能夠從成功的OPTIONS請求中發佈頭文件以證明服務器實際上能夠處理這些請求。

+0

不幸的是,當從本地主機或從具有域和DNS設置的web服務器調用時,會發生同樣的事情。謝謝,不過。 – Aarmora

+0

另一件事是您的服務器由於某些邏輯問題(通過cookie /憑證或其他原因)未返回響應。您是否可以添加處理這些請求的服務器端代碼的POST和OPTION端點? –

+0

是的,該服務器可以在Edge上爲其他人或我工作。它只適用於Chrome和Firefox。 – Aarmora

1

你爲什麼不阻止進入OPTIONS請求循環。有時真的讓你發瘋。其他瀏覽器不會觸發OPTIONS請求,但Chrome和Firefox會確保CORS。我已經成功地使用了這個庫,名爲xdomain從github,它真的工作!他們的github介紹頁面將xdomain介紹爲CORS alternative。最重要的是我在JQuery中使用它,但它也支持Angular的http服務。看看它 。它可以幫助你的好:)。這裏是鏈接庫Xdomain CORS Alternative

相關問題