ajax請求攜帶cookie和自定義請求頭header(跨域和同域問題)


錯誤: 1.ajax請求時是不會自動帶上cookie的,要是想讓他帶上的話,必須設置withCredential為true。 正確: 1.ajax同域請求下,ajax會自動帶上同源的cookie; 2.ajax同域請求下,ajax添加自定義請求頭(或原裝)header,前端、后台不需要增加任何配置, 並且不會因為增加自定義請求頭header,而引起預檢查請求(options); 3.ajax跨域請求下,如果不需要攜帶cookie、請求頭header,只需要在后台配置相應參數即可; 后台參數: (1).Access-Control-Allow-Origin:設置允許跨域的配置, 響應頭指定了該響應的資源是否被允許與給定的origin共享; 4.ajax跨域請求下,ajax不會自動攜帶同源的cookie,需要通過前端配置相應參數才可以跨域攜帶同源cookie,后台配置相應參數才可以跨域返回同源cookie; 前端參數: withCredentials: true(發送Ajax時,Request header中會帶上Cookie信息) 后台參數: (1).Access-Control-Allow-Origin:設置允許跨域的配置, 響應頭指定了該響應的資源是否被允許與給定的origin共享; 特別說明:配置了Access-Control-Allow-Credentials:true則不能把Access-Control-Allow-Origin設置為通配符*; (2).Access-Control-Allow-Credentials:響應頭表示是否可以將對請求的響應暴露給頁面(cookie)。返回true則可以,其他值均不可以。 5.ajax請求任何時候都不會帶上不同源的cookie(Cookie遵循同源策略); 6.ajax跨域請求下,ajax添加自定義或者原裝的請求頭,請求會發送兩次,第一次預檢查請求,第二次正常請求,詳細描述: post(或GET)跨域請求時,分為簡單請求和復雜請求,跨域攜帶自定義或者原裝請求頭頭時是復雜請求。 復雜請求會先發送一個method 為option的請求,目的是試探服務器是否接受發起的請求. 如果服務器說可以,再進行post(或GET)請求。 對於java后台web應用,跨域需要添加一個過濾器(過濾器詳見下面案例代碼),這個過濾器做的事就是,加了幾個http header在返回中, Access-Control-Allow-Origin 我能接受的跨域請求來源,配置主機名 Access-Control-Allow-Headers 表示能接受的http頭部,別忘了加入你自己發明創造的頭部 Access-Control-Allow-Methods 表示能接受的http mothed ,反正就那幾種,全寫上也無妨,猥瑣點就只寫 post, options 如果是OPTION返回空,設置返回碼為202,202表示通過。 需要前端配置相應參數才可以跨域攜帶請求頭,后台配置相應參數進行跨域攜帶請求頭; 前端參數: crossDomain:true(發送Ajax時,Request header 中會包含跨域的額外信息,但不會含cookie(作用不明,不會影響請求頭的攜帶)) 后台參數(配置預檢查過濾器): (1)Access-Control-Allow-Origin:設置允許跨域的配置, 響應頭指定了該響應的資源是否被允許與給定的origin共享; (2)Access-Control-Allow-Credentials:響應頭表示是否可以將對請求的響應暴露給頁面(cookie)。返回true則可以,其他值均不可以; (3)Access-Control-Allow-Headers:用於預檢請求中,列出了將會在正式請求的 Access-Control-Request-Headers 字段中出現的首部信息。(自定義請求頭); (4)Access-Control-Allow-Methods:在對預檢請求的應答中明確了客戶端所要訪問的資源允許使用的方法或方法列表; 親測小結論: 1.ajax跨域請求下,后台不配置跨域Access-Control-Allow-Origin,同樣能夠執行后台方法,但是無法執行ajax的success的方法,控制台報跨域錯誤; 2.ajax跨域請求下,前端配置withCredentials: false,同樣能夠執行后台方法,但是無法攜帶同源cookie,后台無法獲取; 3.ajax跨域請求下,前端配置withCredentials: true,后端沒有配置Access-Control-Allow-Credentials:true,同樣能夠執行后台方法,並能夠生成cookie並返回瀏覽器,但是無法執行ajax的success的方法,控制台報跨域錯誤; 4.ajax跨域請求下,前端配置withCredentials: false或不配置withCredentials,后端配置Access-Control-Allow-Credentials:true或者false,同樣能夠執行后台方法,並能夠生成cookie並返回瀏覽器,但是無法攜帶同源cookie,能夠執行ajax的success的方法; 5.Cookie攜帶只區分域名,不區分端口; 6.jsonp可以攜帶cookie,但只能攜帶所屬域名的cookie(同源策略); 7.jsonp可以跨域生成cookie,流程如下:跨域請求之后,在服務器端生成cookie,並在瀏覽器端記錄相應的cookie; 8.靜態資源同樣會攜帶cookie(js和圖片等),但是如果是和當前頁面不同域只是在network中不顯示cookie選項,但是后台能夠獲取到對應cookie; 9.ajax同域請求會自動帶上同源的cookie,不會帶上不同源的cookie; 10.這是MDN對withCredentials的解釋: MDN-withCredentials ,我接着解釋一下同源。 眾所周知,ajax請求是有同源策略的,雖然可以應用CORS等手段來實現跨域,但是這並不是說這樣就是“同源”了。ajax在請求時就會因為這個同源的問題而決定是否帶上cookie,這樣解釋應該沒有問題了吧,還不知道同源策略的,應該去谷歌一下看看。 總結:最好前端后台配置跨域,則同時配置相應的跨域配置,否則總會出現不可控的錯誤;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM