进阶13 JSONP 跨域

题目1: 什么是同源策略

浏览器出于安全方面的考虑,只允许与本域下的接口交互。不同源的客户端脚本在没有明确授权的情况下,不能读写对方的资源。

  • 本域指的是?
    同协议:如都是http,https,file,ssh,mailto,tel
    同域名:如都是http://jirengu.com/ahttp://jirengu.com/b
    同端口:如都是80端口
  • 不同源的例子:
    http://jirengu.com/main.jshttps://jirengu.com/a.php(协议不同)
    http://jirengu.com/main.jshttp://bbs.jirengu.com/a.php (域名不同,域名必须完全相同才可以)
    http://jiengu.com/main.jshttp://jirengu.com:8080/a.php(端口不同,第一个是80)
    http://jiengu.com/main.jshttp://jiengu.com.cn/main.js
题目2: 什么是跨域?跨域有几种实现形式
  • 跨域:突破同源策略的限制,允许不同域的接口进行交互
  • 实现形式:
    1. JSONP
    2. CORS
    3. 降域
    4. postMessage
题目3: JSONP 的原理是什么

利用

server.js

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

http.createServer(function(req, res){
  var pathObj = url.parse(req.url, true)

  switch (pathObj.pathname) {
    case '/getNews':
      var news = [
        "第11日前瞻:中国冲击4金 博尔特再战200米羽球",
        "正直播柴飚/洪炜出战 男双力争会师决赛",
        "女排将死磕巴西!郎平安排男陪练模仿对方核心"
        ]
      res.setHeader('Content-Type','text/json; charset=utf-8')
      if(pathObj.query.callback){
        res.end(pathObj.query.callback + '(' + JSON.stringify(news) + ')')
      }else{
        res.end(JSON.stringify(news))
      }

      break;

    default:
      fs.readFile(path.join(__dirname, pathObj.pathname), function(e, data){
        if(e){
          res.writeHead(404, 'not found')
          res.end('

404 Not Found

') }else{ res.end(data) } }) } }).listen(8080)
jsonp测试1.png

jsonp测试2.png
  • CORS
    index.html





news



  
  • 博彩赔率挺中国夺回第二纽约时报:中国因对手服禁药而丢失的奖牌最多
  • 最“出柜”奥运?同性之爱闪耀里约
  • 跪拜谢与洪荒之力一样 都是真情流露

server.js

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

http.createServer(function(req, res){
  var pathObj = url.parse(req.url, true)

  switch (pathObj.pathname) {
    case '/getNews':
       var news = [
        "第11日前瞻:中国冲击4金 博尔特再战200米羽球",
        "正直播柴飚/洪炜出战 男双力争会师决赛",
        "女排将死磕巴西!郎平安排男陪练模仿对方核心",
        "没有中国选手和巨星的110米栏 我们还看吗?",
        "中英上演奥运金牌大战",
        "博彩赔率挺中国夺回第二纽约时报:中国因对手服禁药而丢失的奖牌最多",
        "最“出柜”奥运?同性之爱闪耀里约",
        "下跪拜谢与洪荒之力一样 都是真情流露"
    ]
    var data = [];
    for(var i=0; i<3; i++){
        var index = parseInt(Math.random()*news.length);
        data.push(news[index]);
        news.splice(index, 1);
    }
      res.setHeader('Access-Control-Allow-Origin','http://localhost:8080')
      //res.setHeader('Access-Control-Allow-Origin','*')
      res.end(data);
      break;
    default:
      fs.readFile(path.join(__dirname, pathObj.pathname), function(e, data){
        if(e){
          res.writeHead(404, 'not found')
          res.end('

404 Not Found

') }else{ res.end(data) } }) } }).listen(8080)
cors测试1.png

cors测试2.png
  • 降域
    a.html



使用降域实现跨域

b.html




    


降域测试.png

利用document.domain 实现跨域

补充说明:Windows10系统如何更改hosts

  1. 管理员身份打开命令行


    步骤1.png

    2.在命令行输入notepad 回车,以管理员身份打开记事本


    步骤2.png

    3.打开的记事本页面中点右上角的文件,然后打开,找到C:\Windows\System32\drivers\etc路径下的hosts文件,点击打开
    步骤3.png

    4.在最下行输入要添加的修改文件,保存关闭


    步骤4.png
  • postMessage
    a.html



  
  
  降域
  


  

使用postMessage实现跨域

b.html




    
    
    降域
    


    
    


postMessage测试.png

你可能感兴趣的:(进阶13 JSONP 跨域)