1. 程式人生 > 實用技巧 >jsonp跨域簡單實現

jsonp跨域簡單實現

同源策略

基於安全的考慮,現如今瀏覽器中都引入了同源策略。所說的同源就是協議、域名、埠這三個都相同

例如:對於http://www.example.com/a.js。協議是http,域名是www.example.com,埠預設為80

http://www.example.com/b.js         同源
http://www.example.com:8080/a.js 不同源
http://www.example123.com/a.js    不同源
https://www.example.com/a.js 不同源      

受同源策略的限制,對於非同源之間是不能傳送AJAX請求的

建立檔案a.js,在其中任意編寫一些內容

var a = 'jsonp'

在同一目錄下建立檔案index.js,用node開啟一個伺服器

var http = require('http')
var fs = require('fs')

var server = http.createServer()

server.on('request', function (req, res) {
  if (req.url === '/a.js') {
    fs.readFile('./a.js', 'utf-8', function (err, data) {
      if (err) {
        res.end(err)
      } 
else { res.end(data) } }) } }) server.listen(3000, function () { console.log('3000 port is open') })

建立檔案index.html,發起AJAX請求,訪問伺服器中的檔案a.js

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>jsonp</title>
</head>
<body
> <script> var xhr = new XMLHttpRequest() xhr.open('get', 'http://127.0.0.1:3000/a.js') xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) {
     // 將響應的結果輸出到控制檯 console.log(xhr.responseText) } } xhr.send()
</script> </body> </html>

從控制檯的輸出可以看到AJAX請求不能跨域

Jsonp的簡單實現

解決跨域訪問的方法有很多,Jsonp就是其中一種。它是藉助script標籤能跨域載入資料的特性來實現的

對之前的檔案index.js做一些修改,通過解析url來獲得url中攜帶的引數

var http = require('http')
var fs = require('fs')
var url = require('url')

var server = http.createServer()

server.on('request', function (req, res) {
url
= url.parse(req.url, true) if (url.pathname === '/a.js') { fs.readFile('./a.js', 'utf-8', function (err, data) { if (err) { res.end(err) } else { res.end(url.query.callback + '(' + JSON.stringify(data) + ')') } }) } }) server.listen(3000, function () { console.log('3000 port is open') })

建立檔案jsonp.html,藉助script標籤訪問伺服器所在的檔案a.js

<!DOCTYPE html>
<html lang="en">
<
head> <meta charset="UTF-8"> <title>Document</title> <script> function fun (data) { console.log(data) } var s = document.createElement('script') var url = 'http://127.0.0.1:3000/a.js?callback=fun' s.setAttribute('src', url) document.getElementsByTagName('head')[0].appendChild(s) </script> </head>
<body>
</body> </html>

檢視控制檯輸出,成功訪問到了a.js中的資料,jsonp跨域成功

jsonp優缺點

優點:不受同源策略的限制,相容性也很好

缺點:它只支援get請求而不支援post等其它型別的請求