1. 程式人生 > >關於跨域的cookie問題

關於跨域的cookie問題

true 博客 分享 quest 瀏覽器 clas 大神 cors 你會

cors下的cookie問題可以參考阮一峰的博客鏈接:http://www.ruanyifeng.com/blog/2016/04/cors.html

但是在實際開發當中還是會遇到點小問題,這裏記錄一下:

在火狐瀏覽器當中,如果xhr.async: false,那麽在火狐瀏覽器下會報錯。

默認的情況下,cors做到跨域之後是沒有供應憑證(cookie、HTTP認證及客戶端SSL證實等)(童鞋們都有牽扯到cookie吧,如果大神的網站一丁點都不占cookie的,此文略過)。重點來了,我們可以使用ajax配置項 withCredentials來解決這個問題,下來分別看看原生xhr和jquery的ajax是怎麽做配置的:  

技術分享圖片
//原生的配置
var xhr = new XMLHttpRequest();
xhr.open(‘GET‘, ‘http://www.xxx.com/api‘);
xhr.withCredentials = true;
xhr.async=false; xhr.onload = onLoadHandler; xhr.send();
技術分享圖片 技術分享圖片
//jquery ajax配置
$.ajax({
            type: "GET",
            url: ‘data/tree.json‘,
async:false, xhrFields: { withCredentials: true } }).done(function(data) { console.log(data); });
技術分享圖片

但是!!!!在火狐瀏覽器中你會發現報錯了

技術分享圖片

也就是說在啟用同步模式的ajax後,在火狐瀏覽器中withCredentials配置是並不起作用的,並且不能正常返回數據,導致我們的請求“失敗!”

解決方案:

jquery配置模式需要修改:

技術分享圖片
$.ajax({
            type: "GET",
            dataType: "json",
            url: ‘data/tree.json‘,
            beforeSend: function(xhr) {
                xhr.withCredentials = true;
            }
        }).done(function(data){
         console.log(data);
});
技術分享圖片

將withCredentials配置寫進beforeSend函數,就可以解決了

關於跨域的cookie問題