博客列表 >CORS和JSONP的跨域请求

CORS和JSONP的跨域请求

我是郭富城
我是郭富城原创
2020年05月27日 04:27:03726浏览

跨域请求

一、什么是跨域请求

  • 域=协议名+主机名+端口号,只有这三部分相同才能称为是相同的域访问。
  1. http://www.php.cn:80和ftp://www.php.cn:80 不同域,协议不一样
  2. http://www.php.cn:80和http://www.baidu.com:80 不同域,主机名不一样
  3. http://www.php.cn:80和ftp://www.php.cn:8080 不同域,端口号不一样
  4. http://www.php.cn:80/a.html和http://www.php.cn:80/b.js 同域

二、为什么要限制跨域请求

  • 最主要的原因就是安全性问题,比如 CSRF 攻击。但是,既然不安全,为什么我们又要跨域请求呢?原因是有时为了服务器便于管理和减轻服务器压力,公司会把不同的资源放在不同的服务器上,这样就存在很多子域,这时比如 A子域的 html资源要去访问 B子域的图片资源就会出现跨域请求了。

三、通过 CORS 方式解决简单跨域请求

  • CORS:全称”跨域资源共享”(Cross-origin resource sharing
  • CORS就是跨源资源共享,这种机制利用浏览器所支持的向跨源服务器发出 xmlhttprequest 请求,所以我们只需要做的是在服务器端判断是否允许这个域访问,剩下的浏览器会自动做好,添加一些头信息。

    CORS 需要浏览器和服务器同时支持,才可以实现跨域请求,目前几乎所有浏览器都支持 CORS,IE 则不能低于 IE10。CORS 的整个过程都由浏览器自动完成,前端无需做任何设置,跟平时发送 ajax 请求并无差异。实现 CORS 的关键在于服务器,只要服务器实现 CORS 接口,就可以实现跨域通信。

  1. Access-Control-Allow-Origin: http://localhost:80 //该字段表明可供那个源跨域
  2. Access-Control-Allow-Methods: GET, POST, PUT // 该字段表明服务端支持的请求方法
  3. Access-Control-Allow-Headers: X-Custom-Header // 实际请求将携带的自定义请求首部字段

CORS 字段介绍

1.Access-Control-Allow-Methods

该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次”预检”请求。

2.Access-Control-Allow-Headers

如果浏览器请求包括 Access-Control-Request-Headers 字段,表明服务器支持的所有头信息字段,不限于浏览器在”预检”中请求的字段。

3.Access-Control-Allow-Credentials

4.Access-Control-Max-Age

该字段可选,用来指定本次预检请求的有效期,单位为秒。上

四、通过 JSONP 方式处理跨域请求

  • 只要服务端提供的 js 脚本是动态生成,这样调用者可以传一个参数过去告诉服务端 “我想要一段调用某函数的 js 代码,请你返回给我”,于是服务器就可以按照客户端的需求来生成动态 js 脚本并响应。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <button>跨域请求-JSONP</button>
  10. <script>
  11. // 1. 准备好回调处理函数
  12. function handle(jsonData) {
  13. console.log(jsonData);
  14. var data = JSON.parse(jsonData);
  15. console.log(data);
  16. // 将接口返回的数据渲染到页面中
  17. var ul = document.createElement("ul");
  18. ul.innerHTML += "<li>" + data.title + "</li>";
  19. ul.innerHTML += "<li>姓名:" + data.user.name + "</li>";
  20. ul.innerHTML += "<li>邮箱: " + data.user.email + "</li>";
  21. document.body.appendChild(ul);
  22. }
  23. // 2. 点击按钮发起一个基于JSONP的跨域请求
  24. var btn = document.querySelector("button");
  25. btn.addEventListener(
  26. "click",
  27. //动态生成js
  28. function () {
  29. //生成一个元素
  30. var script = document.createElement("script");
  31. //添加一个src地址
  32. script.src = "http://php.edu/0522/test2.php?jsonp=handle&id=3";
  33. //添加到head中
  34. document.head.appendChild(script);
  35. },
  36. false
  37. );
  38. </script>
  39. </body>
  40. </html>

五、总结

跨域请求的处理方式有很多,除了上面提的 JSONP 策略和 CORS 策略,还有通过 window.name 属性等方式解决跨域请求。总的来说,使用 CORS 简单请求,非常容易,对于前端来说无需做任何配置,与发送普通 ajax 请求无异。唯一需要注意的是,需要携带 cookie 信息时,需要将 withCredentials 设置为 true 即可。CORS的配置,完全在后端设置,配置起来也比较容易,目前对于大部分浏览器兼容性也比较好。CORS 优势也比较明显,可以实现任何类型的请求,相较于 JSONP 跨域只能使用 get 请求来说,也更加的便于我们使用。
但 ajax 和 jsonp 其实本质上是不同的东西。ajax 的核心是通过 XmlHttpRequest 获取非本页内容,而 jsonp 的核心则是动态添加

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议