解決跨域導致session丟失以及多OPTIONS請求問題。
正常來講,在服務器端允許跨域,只需設置如下即可:
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
但是跨域時,session會引起丟失,express里每次給客戶端發放cookie后,客戶端都反不回來,所以,每次都像是一個新的提交。所以跨域的設置第一行應改為如下:
res.header("Access-Control-Allow-Origin", "http://192.168.1.240"); //不能為*了,必須指定
response.setHeader("Access-Control-Allow-Credentials","true"); //是否支持cookie跨域
相應Angular4中在發起請求時,也應該在頭部如下設置:
let headers = new Headers({'Content-Type': 'application/x-www-form-urlencoded'});
let options = new RequestOptions({headers: headers, withCredentials: true});
return this.http.post(submitUrl, params, options)....
參考如下:
angular跨域和session失效問題
OPTIOP請求問題,因為跨域,在RFC文檔中有說明,客戶端會先發起一個OPTIONS請求,因為我們的POST請求的頭部表明了Content-Type類型是application/json,不是以下之一:
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
所以會引起OPTIONS請求,經過我不斷嘗試,還是沒有達到我請求類型為application/json,而不發起OPTIONS請求的目的,所以最終正常將請求類型改為application/x-www-form-urlencoded,這樣一來,我客戶端的payload序列化后就變成了屬性名,我只能在服務器端取到這個屬性名再反序列化。
http.post(submitUrl, params, options) // params即是序列化后的json對象
服務器端
var mybody = req.body;
for(var key in mybody){
break;
}
var params = JSON.parse(key); // params 即是反序列化后的json對象
我知道很惡心,但是只能暫時這樣。
相關閱讀及參考: