[关闭]
@ranger-01 2018-05-22T21:14:22.000000Z 字数 3318 阅读 947

跨域请求

cors web


1. Same Origin Policy

理解跨域首先必须要了解同源策略。同源策略是浏览器上为安全性考虑实施的非常重要的安全策略。

2. Cros Origin

2.1 document.domain

  1. <script type="text/javascript">
  2. function test(){
  3. var iframe = document.getElementById('ifame');
  4. var win = document.contentWindow;//可以获取到iframe里的window对象,但该window对象的属性和方法几乎是不可用的
  5. var doc = win.document;//这里获取不到iframe里的document对象
  6. var name = win.name;//这里同样获取不到window对象的name属性
  7. }
  8. </script>
  9. <iframe id = "iframe" src="http://damonare.cn/b.html" onload = "test()"></iframe>
  1. // 在页面http://www.damonare.cn/a.html 中
  2. <iframe id = "iframe" src="http://damonare.cn/b.html" onload = "test()"></iframe>
  3. <script type="text/javascript">
  4. document.domain = 'damonare.cn';//设置成主域
  5. function test(){
  6. alert(document.getElementById('iframe').contentWindow);//contentWindow 可取得子窗口的 window 对象
  7. }
  8. </script>
  9. // 在页面http://damonare.cn/b.html 中也设置document.domain:
  10. <script type="text/javascript">
  11. document.domain = 'damonare.cn';//在iframe载入这个页面也设置document.domain,使之与主页面的document.domain相同
  12. </script>

2.2 JSONP(json padding)

利用标签没有跨域限制的“漏洞”(历史遗迹啊)来达到与第三方通讯的目的

  1. // jQuery
  2. $.ajax({
  3. url: "http://tonghuashuo.github.io/test/jsonp.txt",
  4. dataType: 'jsonp',
  5. jsonp: "callback",
  6. jsonpCallback: "dosomething"
  7. })
  8. .done(function(res) {
  9. console.log("success");
  10. console.log(res);
  11. })
  12. .fail(function(res) {
  13. console.log("error");
  14. console.log(res);
  15. });
  16. // js
  17. <script>
  18. // 实现回调函数,这里没有了 jQuery 的封装,必须手动指定并实现
  19. var dosomething = function(data){
  20. console.log(data);
  21. };
  22. // 提供 JSONP 服务的 URL 地址,查询字符串中加入 callback 指定回调函数
  23. var url = "tonghuashuo.github.io/test/jsonp.txt?callback=docomething";
  24. // 创建 <script> 标签,设置其 src 属性
  25. var script = document.createElement('script');
  26. script.setAttribute('src', url);
  27. // 把 <script> 标签加入 <body> 尾部,此时调用开始。
  28. document.getElementsByTagName('body')[0].appendChild(script);
  29. // 因为目标 URL 是一个后台脚本,访问后会被执行,返回的 JSON 被包裹在回调函数中以字符串的形式被返回。
  30. // 返回的字符串放入 <script> 中就成为了一个普通的函数调用,执行回调函数,返回的 JSON 数据作为实参被传给了回调函数。
  31. </script>
  1. $result = "{'data':'JSONP Works'}"; // 这里省略了数据库查询等操作,直接给出返回值
  2. $callback = $_GET['callback']; // 最好加上判空和默认值,以防拿不到参数
  3. echo $callback."(".$result.")";
  4. // 返回的结果
  5. // dosomething({"data":"JSONP Works"});

2.3 CORS

整个CORS通信过程,都是浏览器自动完成,不需要用户参与。实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

3. 参考链接

  1. 前端跨域知识总结
  2. 跨域资源共享 CORS 详解
  3. django-cors-headers
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注