jsonp和cors實現跨域

jsonp實現的原理主要是利用src屬性能夠去加載跨域的資源,例如script、img。 動態的建立script標籤,加載跨域資源html

下面看一個簡單的例子: 前端:(本頁面的端口號爲63342)前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script src="http://localhost:8080/js/index.js"></script>//去加載跨域資源
</html>

跨域資源站點後端(我這裏使用nodejs寫的,很簡單的一個server):node

const express=require('express');
const fs=require('fs');
const expressStatic=require('express-static')
var server=express();
server.get('/js/index.js',function (req,res) {
   fs.readFile('./js/index.js',function (err,data) {
       if(err){
           res.send('數據讀取失敗')
       }else {
           res.send(data);
       }
       res.end();
   })
})
server.listen(8080);

那麼咱們能夠在前端頁面看到結果,如圖 輸入圖片說明express

2、用xhr去請求數據會怎麼樣呢: 前端:json

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<span>名字:</span><span class="name"></span><br/>
<span>年齡:</span><span clase="age"></span>
</body>
<script >
    function XHR() {
        var xhr;
        try {
            xhr = new XMLHttpRequest();
        }
        catch (e) {
            var IEXHRVers = ["Msxml3.XMLHTTP", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
            for (var i = 0, len = IEXHRVers.length; i < len; i++) {
                try {
                    xhr = new ActiveXObject(IEXHRVers[i]);
                }
                catch (e) {
                    continue;
                }
            }
        }
        return xhr;
    }
    var xhr = XHR();
    xhr.open('GET', 'http://localhost:8080/json/test.json', true);
    xhr.onreadystatechange = function () {
        //xhr.onload=
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                var da = xhr.responseText;
                eval("var json=" + da);
// var json=JSON.parse(da)
               console.log(json);
            } else {
                console.log("數據請求出錯");
            }
        }
    }
    // xhr.onerror=function () {
    //     console.log('數據請求出錯')
    // }
    xhr.send(null)
</script>
</html>

後端:後端

const express=require('express');
const fs=require('fs');
// const expressStatic=require('express-static');
var server=express();
server.get('/json/test.json',function (req,res) {
    var obj=req.query;
        fs.readFile('./json/test.json',function (err,data) {
            if(err){
                res.send('數據讀取失敗')
            }else {
                res.send(data);
            }
            res.end();
        })
})
// server.use(expressStatic('./'))
server.listen(8080);
console.log('啓動成功')

結果:跨域了沒法請求到數據跨域

輸入圖片說明

3、相對jsonp只能請求get數據,cors跨域資源共享實現跨域請求資源更好 只須要後端實現cors接口就好,改變http響應頭。app

const express=require('express');
const fs=require('fs');
// const expressStatic=require('express-static');
var server=express();
server.get('/json/test.json',function (req,res) {
    var obj=req.query;
    res.header("Access-Control-Allow-Origin", "*");//全部站點均可以訪問該資源
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By",' 3.2.1')
    res.header("Content-Type", "application/json;charset=utf-8");
        fs.readFile('./json/test.json',function (err,data) {
            if(err){
                res.send('數據讀取失敗')
            }else {
                res.send(data);
            }
            res.end();
        })
})
// server.use(expressStatic('./'))
server.listen(8080);
console.log('啓動成功')

cors的詳解能夠去看阮一峯老師的博客cors

相關文章
相關標籤/搜索