通过 XHR 实现 Ajax 通信的一个主要限制,来源于跨域安全策略。默认情况下,XHR 对象只能访 问与包含它的页面位于同一个域中的资源。这种安全策略可以预防某些恶意行为。但是,实现合理的跨 域请求对开发某些浏览器应用程序也是至关重要的。 CORS(Cross-Origin Resource Sharing,跨源资源共享)是 W3C 的一个工作草案,定义了在必须访 问跨源资源时,浏览器与服务器应该如何沟通。CORS 背后的基本思想,就是使用自定义的 HTTP 头部 让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败

IE对CORS的实现

微软在 IE8 中引入了 XDR(XDomainRequest)类型。这个对象与 XHR 类似,但能实现安全可靠
的跨域通信。XDR 对象的安全机制部分实现了 W3C 的 CORS 规范。以下是 XDR 与 XHR 的一些不同之
处。

  • cookie 不会随请求发送,也不会随响应返回。
  • 只能设置请求头部信息中的 Content-Type 字段。
  • 不能访问响应头部信息。
  • 只支持 GET 和 POST 请求。

这些变化使 CSRF(Cross-Site Request Forgery,跨站点请求伪造)和 XSS(Cross-Site Scripting,跨
站点脚本)的问题得到了缓解。

注⚠️:
常见的web前端的攻击方式有哪些?

  • XSS 跨站点脚本攻击

如博客嵌入script脚本
npm xss包
对尖括号用&lt 和 &gt 代替

  • XSRF跨站点请求伪造攻击

    1. 伪造电子邮件<br /> 增加验证信息

其他浏览器对CORS的实现 这一段挺重要,得搞会

Firefox 3.5+、Safari 4+、Chrome、iOS 版 Safari 和 Android 平台中的 WebKit 都通过 XMLHttpRequest
对象实现了对 CORS 的原生支持。在尝试打开不同来源的资源时,无需额外编写代码就可以触发这个行
为。要请求位于另一个域中的资源,使用标准的 XHR 对象并在 open()方法中传入绝对 URL 即可,例如:

  1. var xhr = createXHR();
  2. xhr.onreadystatechange = function() {
  3. if (xhr.readyState == 4) {
  4. if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
  5. alert(xhr.responseText);
  6. } else {
  7. alert("Request was unsuccessful: " + xhr.status);
  8. }
  9. }
  10. };
  11. xhr.open("get", "http://www.somewhere-else.com/page/", true);
  12. xhr.send(null);

注意⚠️:

与 IE 中的 XDR 对象不同,通过跨域 XHR 对象可以访问 status 和 statusText 属性,而且还支 持同步请求。跨域 XHR 对象也有一些限制,但为了安全这些限制是必需的。以下就是这些限制。

  • 不能使用 setRequestHeader()设置自定义头部。
  • 不能发送和接收 cookie。
  • 调用 getAllResponseHeaders()方法总会返回空字符串。

其他跨域技术

1、img图像

  1. var img = new Image();
  2. img.onload = img.onerror = function(){
  3. alert("Done!");
  4. };
  5. img.src = "http://www.example.com/test?name=Nicholas";

2、JSONP

JSONP 是 JSON with padding(填充式 JSON 或参数式 JSON)的简写,是应用 JSON 的一种新方法, 在后来的 Web 服务中非常流行。JSONP 看起来与 JSON 差不多,只不过是被包含在函数调用中的 JSON, 就像下面这样。

callback({ “name”: “Nicholas” });

JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调

函数的名字一般是在请求中指定的。而数据就是传入回调函数中的JSON数据。下面是一个典型的JSONP

请求。

http://freegeoip.net/json/?callback=handleResponse

3、Comet(很新,以前不知道)

Comet 是 Alex Russell发明的一个词儿,指的是一种更高级的 Ajax 技术(经常也有人称为“服务器
推送”)。Ajax 是一种从页面向服务器请求数据的技术,而 Comet 则是一种服务器向页面推送数据的技
术。Comet 能够让信息近乎实时地被推送到页面上,非常适合处理体育比赛的分数和股票报价。

4、当然还有后端nodejs的中间件、Nginx反向代理(只需简单配置)