• 跨域是什么?如何实现?


    ㈠定义

    ⑴跨域,是指浏览器不能执行其他网站的脚本。

    ⑵它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。

     

    ㈡造成跨域的场景

    协议不同   域名不同    端口不同

    ②什么是协议,域名,端口?

    解释:假如一个网址是  http://baidu.com:8080?user=name&pwd=password

    http://   是协议   

    baidu.com  是域名(注意:前面加上“wwww”即www.baidu.com不是域名)

    8080  是端口    

    user=name&pwd=password   是地址带的参数

     

    ⑴域名不同(域名访问和IP访问也造成跨域)

    http://www.baidu.com

    http://14.215.177.38

    http://www.case.com

     

    ⑵子域名不同

    http://www.example.com

    http://a.example.com

     

    ⑶端口不同

    http://www.example.com(:80)

    http://www.example.com(:8080)

     

    ⑷协议不同

    http://www.example.com

    https://www.example.com

     

    ㈢实现跨域访问的方式

    JSONP跨域

    iFrame跨域

    协议跨域 (跨域资源访问CORS)

     

    ㈣JSONP跨域

    ⑴原理: 利用script标签src可以用外链的功能。

    即:<script src="http://www.external.com/link/action.js"></script>

     

    ⑵必要条件:

    1、 externalLink返回的内容必须为一段可执行脚本

    2、 当前域同外域约定好脚本执行的函数名(jsonpCallback)

    3、 传入函数的实参data


    ⑶格式如下

    action.js  content:
    
    jsonpCallback(data);
    
    data type:  number| string | boolean | object
    
    当前域声明函数:
    jsonpCallback(result) {
         /* code statement */
     }

     

    ㈤iFrame跨域

    iframe存在页面嵌套关系,即会有父页面(outer.html)和子页面(inner.html)。

    这样就存在父页面使用子页面的数据,子页面使用父页面数据的情况。

    1. 非一个根域:

    需要一个中间页面做代理,通过window.name获取不同域页面下的数据.

    原理: iframe加载不同的src,window.name是可以被传递的。

    父页面: lichenfan.com

    子页面: innomachine.com.cn

    父页面--->子页面数据

    1) load 子页面,子页面设置window.name. 

    2) load 代理页面,代理页面和父页面同域。

    子页面--->父页面数据

    load 子页面,给子页面的页面路径修改不同的hash

    子页面定义window.onhashchange的事件,触发获取数据。

    2. 同一个根域: 

    www.lichenfan.com 和 sen.lichenfan.com

    在当前的文档下设置 document.domain = "lichenfan.com" 即可。

    父页面--->子页面数据

    window.iframe.contentWindow.xx;

    子页面--->父页面数据

    window.parent.xxx;

    ㈥协议跨域

    被访问域名在webservice配置跨域访问的header即可,会用到两个header。

    Access-Control-Allow-Origin: * | 访问域名;

    Access-Control-Allow-Methods: GET | POST | PUT | DELETE;

    参考:https://zhuanlan.zhihu.com/p/24632196

     

  • 相关阅读:
    uu 模块
    程序员都是好男人
    TCP基础知识
    最全 git 命令总结
    iOS 添加UIWindow不显示问题解决
    解决CFBundleIdentifier", Does Not Exist
    Mac 系统OS X>=10.9,怎么把默认的python切换成3.7或者更高
    OC算法练习-Hash算法
    设计模式架构模式
    runtime相关知识
  • 原文地址:https://www.cnblogs.com/shihaiying/p/12153201.html
Copyright © 2020-2023  润新知