JS跨域:jsonp、跨域资源共享、iframe+window.name

JS跨域:jsonp、跨域资源共享、iframe+window.name :https://www.cnblogs.com/doudoublog/p/8652213.html

JS中的跨域

请求跨域有好多种,

一、跨域资源共享:

也就是设置服务端的header,可以指定哪些域名可以请求,也是最简单的跨域方式(自我感觉),并且可以支持post等等。

//指定允许其他域名访问
‘Access-Control-Allow-Origin:*‘//或指定域
//响应类型
‘Access-Control-Allow-Methods:GET,POST‘
//响应头设置
‘Access-Control-Allow-Headers:x-requested-with,content-type‘

二、jsonp

由于浏览器的同源策略,所以ajax不能直接跨域请求数据,我们把浏览器的安全策略组关掉(也就是关掉同源策略)就可以啦,当然这是开个玩笑。想了解可以访问这个网站:https://www.cnblogs.com/zhongxia/p/5416024.html

上面说的是ajax会被同源策略拦截下来,但是script中的src并不会被拦截,我们可以利用这个特性实现跨域:

<script>
        //下面就输出你在服务端请求的数据
        function dosomething(data){
            console.log(data);
        }
    </script>
    //src 就是你想要请求的地址,cb是请求时带的参数,这是必须要加的,因为上面的函数名也是这个
    <script src="http://localhost:8080/ChickensSys/backDate?cb=dosomething"></script>

服务端要做相应的配合,这边是用javaweb来调试:在doGet函数里面添加这些代码:

        response.setContentType("text/html");
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        String cbString = request.getParameter("cb");
        PrintWriter out = response.getWriter();
        out.println(cbString + "("this is jsonP ")");
        out.flush();
        out.close();

仔细看:out.println(cbString + "("this is jsonP ")");

我们把参数结果带入进去,可以发现输出的是cb("this is jsonP");相当于是调用这个函数,没错,结果就是这样。

你会看到页面的控制台打印了this isjsonP。

结论:我们用src(不会被同源策略拦截)请求别的域名的数据,返回的结果放在已定义好的函数参数里面并且执行这个函数,然后你要对数据做哪些操作就可以在函数里面随便操作。

三、window.name + iframe跨域获取数据

这个的原理和jsonP差不多吧,也是利用src,不过这次是利用iframe(可以理解html中一个内嵌页面,也可以包含一个html文件)的src和window.name的特性来跨域, window.name属性的神奇之处在于name 值在不同的页面(甚至不同域名)加载后依旧存在(如果没修改则值不会变化),并且可以支持非常长的 name 值(2MB)。也就是你第一次设置后,不管你的iframe重定向到哪个页面,window.name都不会变。

     <script type="text/javascript">
    let iframe = document.createElement(‘iframe‘);
         //src你请求的地址,此时会报错,说你跨域了
    iframe.src = ‘http://localhost:8080/ChickensSys/backDate‘;
    document.body.appendChild(iframe);
    iframe.onload = function() {
        //在本地新建空白的proxy.html因为上面报错了,这边赶紧重定向到本地的proxy.html
      iframe.src = ‘proxy.html‘;//contentWindow属性是指指定的frame或者iframe所在的window对象。
      console.log(iframe.contentWindow.name)
    };
           </script>

服务端需要相应的配合:

out.println("<script>window.name = \"this is CORS</script>");

预期结果跟我们想的一样,一开始报错,我们重定向到本地后就没报错,输出结果也是没错的,因为服务端输出的是一个脚本,window.name=" ";还记得上面讲过window.name 值在不同的页面(甚至不同域名)加载后依旧存在(如果没修改则值不会变化)。但是为什么会一直调用onload函数呢,因为在onload函数中又被重定向所以又一次调用,跟递归差不多意思。既然可以拿到数据,那我们下面来改进下,让它不报错,并只拿到一次数据。

    <script>
    let iframe = document.createElement(‘iframe‘);
    iframe.style.display = ‘none‘;
    var state = 0;
    iframe.onload = function() {
        //重定向完,可以取window.name的数据了,这边可以对数据进行处理
      if(state === 1) {
          var data = iframe.contentWindow.name;
          console.log(data);
          //移除这个节点,其实上面display:none已经对dom无影响了,这个加了保险
          document.body.removeChild(iframe);
          //当下面的iframe.src执行到时,也就是第一次onload,迅速重定向到本地
      } else if(state === 0) {
          state = 1;
          iframe.src = ‘proxy.html‘;
      }
    };
    iframe.src = ‘http://localhost:8080/ChickensSys/backDate‘;
    document.body.appendChild(iframe);
    </script>

运行结果:

只有一次请求。

上面只是讲下原理,我们可以对上面做个封装,封装成一个函数,方便以后用:

    <script>
    //url是请求的地址,handle是处理数据的函数
    function getDataWithIframe(url, handle){
    let iframe = document.createElement(‘iframe‘);
    iframe.style.display = ‘none‘;
    var state = 0;
    iframe.onload = function() {
        //重定向完,可以取window.name的数据了,这边可以对数据进行处理
      if(state === 1) {
          handle(iframe.contentWindow.name);
          //移除这个节点,其实上面display:none已经对dom无影响了,这个加了保险
          document.body.removeChild(iframe);
          //当下面的iframe.src执行到时,也就是第一次onload,迅速重定向到本地
      } else if(state === 0) {
          state = 1;
          iframe.src = ‘proxy.html‘;
      }
    };
    iframe.src = url;
    document.body.appendChild(iframe);
    }
    let url = ‘http://localhost:8080/ChickensSys/backDate‘;
    getDataWithIframe(url, function(data){
        console.log(‘这是请求来的数据:‘ + data);
    })
    </script>

总结:看了好多跨域,大部分都是通过src来跨域的,但好像通过src的都只能是get请求,比如刚说的jsonP和iframe+window.name的方式都是通过get来请求数据,而且都是需要要后端进行相应的配合,比如jsonP需要加个cb()来执行函数,iframe需要<script>window.name=" "</script>来执行赋值语句,第一种设置后端的header的方式倒是可以支持post请求,真是又简单又好用。。。

JS跨域:jsonp、跨域资源共享、iframe+window.name

原文地址:https://www.cnblogs.com/bydzhangxiaowei/p/10287989.html

时间: 2024-10-07 20:57:43

JS跨域:jsonp、跨域资源共享、iframe+window.name的相关文章

原生JS封装Ajax插件(同域&amp;&amp;jsonp跨域)

抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正确的地方,还望指正^_^ 一.Ajax核心,创建XHR对象 Ajax技术的核心是XMLHttpRequest对象(简称XHR),IE5是第一款引入XHR对象的浏览器,而IE5中的XHR对象是通过MSXML库中的一个ActiveX对象实现的,因此在IE中可能有3个版本,即MSXML2.XMLHttp.

跨域问题解决方案(HttpClient安全跨域 &amp; jsonp跨域)

1 错误场景 今天要把项目部署到外网的时候,出现了这样的问题, 我把两个项目放到自己本机的tomcat下, 进行代码调试, 运行 都没有问题的, 一旦把我需要调用接口的项目B放到其他的服务器上, 就会报错, 无法通过Ajax调用springMVC的接口, 这是什么原因呢? 当我使用json ajax post请求传递数据的时候在web端出错:XMLHttpRequest cannot loadhttp://ip:8082/security/auth/outside.do. Origin http

js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)

一.浏览器同源策略 首先我们需要了解一下浏览器的同源策略,关于同源策略可以仔细看看知乎上的一个解释.传送门 总之:同协议,domain(或ip),同端口视为同一个域,一个域内的脚本仅仅具有本域内的权限,可以理解为本域脚本只能读写本域内的资源,而无法访问其它域的资源.这种安全限制称为同源策略. ( 现代浏览器在安全性和可用性之间选择了一个平衡点.在遵循同源策略的基础上,选择性地为同源策略"开放了后门". 例如img script style等标签,都允许垮域引用资源.) 下表给出了相对 

跨域问题相关知识详解(原生js和jquery两种方法实现jsonp跨域)

1.同源策略 同源策略(Same origin policy),它是由Netscape提出的一个著名的安全策略.同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现,现在所有支持JavaScript 的浏览器都会使用这个策略. 所谓同源,就是指两个页面具有相同的协议,主机(也常说域名),端口,三个要素缺一不可. 所谓同源策略,指的是浏览器对不同源的脚本或者文本的访问

JS的jsonp是什么?5分钟学会jsonp跨域请求

一.jsonp是什么? jsonp是解决跨域请求的一种技术.浏览器为了防止CSRF攻击会采用同源策略(协议/主机/端口均相同)限制,对非同源发起http请求(即跨域请求)会被浏览器阻止. 二.jsonp跨域请求的原理? script标签的src属性不受同源策略限制,用此方式对非同源服务器请求资源,返回的JS代码会调用指定的函数,携带的参数就是所需的数据,这样就完成了跨域请求. 三.原生JS的jsonp跨域请求: 首先声明一个处理返回数据的函数,返回的JS代码会调用此函数: function do

深入浅出:了解jsonp跨域的九种方式

什么是“”跨域”: 跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容.由于安全原因,跨域访问是被各大浏览器所默认禁止的.当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理.这就形成了“跨域”. 广义的跨域: 1.) 资源跳转: A链接.重定向.表单提交2.) 资源嵌入: <link>.<script>.<img>.&l

JSONP跨域的原理解析

JSONP跨域的原理解析 一种脚本注入行为 在 2011年10月27日 那天写的     已经有 99238 次阅读了 感谢 参考或原文 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进

JSONP -- 跨域数据交互协议

一.概念 ①传统Ajax:交互的数据格式——自定义字符串或XML描述: 跨域——通过服务器端代理解决. ②如今最优方案:使用JSON格式来传输数据,使用JSONP来跨域. ③JSON:一种数据交换格式.基于纯文本.被原生JS支持.    格式:两种数据类型描述符:大括号{ }.方括号[ ].分隔符逗号.映射符冒号.定义符双引好. ④JSONP:一种跨域数据交互协议,非官方. 1.Web页面调用js文件,可跨域.扩展:但凡有src属性的标签都具有跨域能力. 2.跨域服务器 动态生成数据 并存入js

【转】JSONP跨域的原理解析

JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于JavaScript代码能够访问的页面内容做了很重要的限制,即JavaScript只能访问与包含它的文档在同一域下的内容. JavaScript这个安全策略在进行多iframe或多窗口编程.以及Ajax编程时显得尤为重要.根据这个策略,在baidu.com下的页面中包含的JavaScript代码,不能访问在