1. 程式人生 > >聊聊跨域那些事

聊聊跨域那些事

瀏覽器同源策略: 協議相同,域名相同,埠相同 瀏覽器同源策略會阻止跨域請求,目的是防止CSRF攻擊(跨域請求偽造)

解決方案: 1. JSONP(需要後端配合) 原理是在請求url上加上callback,callback是請求回撥方法的名字, 然後建立script標籤,src寫上請求url, 服務端把資料傳給這個方法名並返回,請求完畢後客戶端就會執行callback 執行完可以刪掉這個script,避免載入多個同樣的script

2. 服務端允許跨域(配合ajax)

// 指定允許其他域名訪問,*可以換成具體的域名
header('Access-Control-Allow-Origin:*');
// 響應型別  
header('Access-Control-Allow-Methods:POST');
// 響應頭設定  
header('Access-Control-Allow-Headers:x-requested-with,content-type');

這裡兩個小問題 一是非同步非簡單請求會先發送一個options請求去驗證,看服務端是否允許跨域,所以服務端需要有個接收options請求的路由並作返回 二是跨域請求不提供憑證( cookie ),所以前端請求要將withCredentials設定為true,服務端也需要設定響應頭 Access-Control-Allow-Credentials: true

3. iframe(主域不同)

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div class="box">
        <iframe id="if" src="b.com/b.html" frameborder="0"></iframe>
    </div>
<script>
    var fr = document.getElementById('if'),
        state = 0;;
        if(window.VBArray){//相容ie
            fr.onreadystatechange = function(){
                if(this.readyState == 'complete'){
                    if(state == 1){
                        // 獲取資料
                        data = fr.contentWindow.name;
                    }else{
                        state = 1;
                        // 重置iframe視窗的src保證同源
                        fr.src = 'a.com/blank.html';
                    }
                }
            }
        }else{
            fr.addEventListener('onload',function(){
                if(state == 1){
                    // 獲取資料
                    data = fr.contentWindow.name;
                }else{
                    state = 1;
                    // 重置iframe視窗的src保證同源
                    fr.src = 'a.com/blank.html';
                }
            },false);
        }
</script>
</body>
</html>

4. nginx反向代理 配置反向代理路徑(以後補充)