Web高级 Ajax和跨域CORS

Asynchronous JavaScript and XML

1. XMLHttpRequest

前端开发都知道,不多说。

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
    if (xhr.readyState !== 4) return;
    if (xhr.status >= 200 && xhr.status < 300) {
        console.log(JSON.parse(xhr.responseText));
    }
    else {
        // What to do when the request has failed
        console.log(‘error‘, xhr);
    }
};
xhr.open(‘GET‘, ‘https://mysite.com/index‘);
xhr.setRequestHeader(‘X-Token‘, ‘123456‘);
xhr.send();

1.1 open方法

定义:open( Method, URL, Asynchronous, UserName, Password )

- Method:GET/POST/HEAD/PUT/DELETE/OPTIONS

- Asynchronous(defualt true)

1.2 setRequestHeader方法

定义:setRequestHeader( Name, Value )

注意,以X开头的为header为自定义头部

1.3 send方法

定义:send(body)

  • body可以是:document,Blob, BufferSource, FormData, URLSearchParams, ReadableStream等

2. Fetch

新一代旨在替换XHR的API方法。

fetch("https://mysite.com/index", {
  method: "POST",
  headers: {
    "Content-Type": "application/x-www-form-urlencoded",
    ‘X-Token‘: ‘123456‘
  },
  body: "id=123"
}).then(function (response) {
    if (response.ok) {
        return response.json();
    } else {
        return Promise.reject({
            status: response.status,
            statusText: response.statusText
        });
    }
})
.then(function (data) {
    console.log(‘success‘, data);
})
.catch(function (error) {
    console.log(‘error‘, error);
});

2.1 fetch方法

定义:fetch(input, init)

  • input:URL或者Request对象
  • init:一个配置项对象,包括所有对请求的设置。可选的参数有:
    • method: 请求使用的方法,如 GET、POST。
    • headers: 请求的头信息,形式为 Headers 对象或 ByteString。
    • body: 请求的 body 信息:可能是一个 Blob、BufferSource、FormData、URLSearchParams 或者 USVString 对象。注意 GET 或 HEAD 方法的请求不能包含 body 信息。
    • mode: 请求的模式,如 cors、 no-cors 或者 same-origin。
    • credentials: 请求的 credentials,如 omit、same-origin 或者 include。
    • cache: 请求的 cache 模式: default, no-store, reload, no-cache, force-cache, or only-if-cached.

2.2 回调

fetch返回一个promise,采用then的链式调用避免回调地狱问题。

2.3 返回值

参考这里:https://developer.mozilla.org/zh-CN/docs/Web/API/Response

3. XHR vs Fetch

  1. Fetch返回值不是可读的形式,需要使用response.json()转换为可读形式
  2. XHR的请求失败通过判断状态码,Fetch请求失败通过catch处理
  3. Fetch默认不带cookie,XHR默认带cookie
  4. Fetch在服务器返回 400,500 错误码时并不会reject而被当做成功处理进then,只有网络错误这些导致请求不能完成才会触发catch
  5. Fetch没有abort和onTimeout,不能中途中断,XHR可以。

Cross-Origin Resource Sharing

CORS是一种机制,用来保护跨域数据传输的安全性和降低风险。

1. 常见的可以跨域请求的资源

  • XHR或Fetch发起的跨域HTTP请求
  • Web字体
  • CSS文件
  • Scripts文件

2. 跨域相关的Http首部

  • Access-Control-Request-Headers

    (Preflight使用)客户端告诉服务器实际请求时使用的头部。

  • Access-Control-Request-Method

    (Preflight使用)客户端告诉服务器实际请求时使用的方法。

  • Access-Control-Allow-Origin

    服务端允许请求的源域

  • Access-Control-Allow-Credentials

    服务端是否允许请求带cookie,设置为true时allow-origin不能为*

  • Access-Control-Allow-Headers

    服务端允许的客户端请求的头部

  • Access-Control-Allow-Methods

    服务端允许客户端请求的方法

  • Access-Control-Max-Age

    preflight可以被缓存的时间

  • Cross-Origin-Resource-Policy

    (fetch使用)具体查看https://fetch.spec.whatwg.org/#cross-origin-resource-policy-header

  • Origin

    客户端请求从哪个域来

1. OPTIONS /resources/post-here/
2. HTTP/1.1
3. Host: bar.other
4. User-Agent: Mozilla/5.0 (Macintosh; U; 5.Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
7. Accept-Language: en-us,en;q=0.5
8. Accept-Encoding: gzip,deflate
9. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
10. Connection: keep-alive
11. Origin: http://foo.example
12. Access-Control-Request-Method: POST
13. Access-Control-Request-Headers: X-PINGOTHER, Content-Type

//响应
14. HTTP/1.1 200 OK
15. Date: Mon, 01 Dec 2008 01:15:39 GMT
16. Server: Apache/2.0.61 (Unix)
17. Access-Control-Allow-Origin: http://foo.example
18. Access-Control-Allow-Methods: POST, GET, OPTIONS
19. Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
20. Access-Control-Max-Age: 86400
21. Vary: Accept-Encoding, Origin
22. Content-Encoding: gzip
23. Content-Length: 0
24. Keep-Alive: timeout=2, max=100
25. Connection: Keep-Alive
26. Content-Type: text/plain

3. 简单请求

跨域请求分为简单请求和预检请求,全部符合下列条件时为简单请求:

  • 使用的方法为:GET/HEAD/POST
  • 不得设置安全首页之外的首页:Accept,Accept-Language,Content-Language,Content-Type,DPR,Downlink,Save-Data,Viewport-Width,Width
  • Content-Type只能是以下值: text/plain, multipart/form-data, application/x-www-form-urlencoded
  • 请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器
  • 请求中没有使用 ReadableStream 对象

当使用普通请求时,如果服务器允许该源域跨域请求资源,则直接返回响应。如果服务器不允许跨域请求,则返回不正确的响应首部,则请求方不会收到任何数据。

4. 预检请求(preflight request)

除了简单请求的情况,其他的CORS请求都会有预检请求。

预检请求会先使用OPTIONS方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求,所以会进行2个回合的通信。

典型的会触发预检请求的跨域情景:请求JSON数据 或 带有自定义头部

如:

  • content-type:application/json
  • X-Audit-Token:X123456

refs:

https://xhr.spec.whatwg.org/

https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

https://gomakethings.com/why-i-still-use-xhr-instead-of-the-fetch-api/

https://hacks.mozilla.org/2015/03/this-api-is-so-fetching/

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

原文地址:https://www.cnblogs.com/full-stack-engineer/p/9818697.html

时间: 2024-07-31 07:41:20

Web高级 Ajax和跨域CORS的相关文章

ASP.NET MVC &amp; WebApi 中实现Cors来让Ajax可以跨域访问 (转载)

什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制.本文详细介绍CORS的内部机制. 一.简介 CORS需要浏览器和服务器同时支持.目前,所有浏览器都支持该功能,IE浏览器不能低于IE10. 整个CORS通信过程,都是浏览器自动完成,不需要用户参与.对于开发者来说,CORS通信与同源的AJAX通信没有差别,代

AJAX POST&amp;跨域 解决方案 - CORS

跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免的需要进行跨域操作,所以跨域能力也算是前端工程师的基本功之一. 和大多数跨域的解决方案一样,JSONP也是我的选择,可是某天PM的需求变了,某功能需要改成支持POST,因为传输的数据量比较大,GET形式搞不定.所以折腾了下闻名已久的CORS(跨域资源共享,Cross-Origin Resource

(转) AJAX POST&amp;跨域 解决方案 - CORS

跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免的需要进行跨域操作,所以跨域能力也算是前端工程师的基本功之一. 和大多数跨域的解决方案一样,JSONP也是我的选择,可是某天PM的需求变了,某功能需要改成支持POST,因为传输的数据量比较大,GET形式搞不定.所以折腾了下闻名已久的CORS(跨域资源共享,Cross-Origin Resource

改变mvc web api 支持android ,ios ,ajax等方式跨域调用

公司一个移动后端的项目用到了 webapi 项目搭建到外网环境共app开发者调用测试接口时遇到了一个问题 接口不允许跨域调用 .查阅资料明白 同源策略原则根据请求报头值 Origin 与回应报头值 Access-Control-Allow-Origin 来判断是否允许调用 解决方法 1.ajax使用jsonp jsonp 是通过请求参数中加入回调函数参数值.webapi 收到回调函数参数值返回数据不再是单纯的json,而是根据回调函数参数值 的js方法调用,这样就避免的同源策略 需要webapi

JavaScript(10)——Ajax以及跨域处理

Ajax以及跨域处理 哈哈哈,终于写到最后一章了.不过也还没有结束,说,不要为了学习而学习,恩.我是为了好好学习而学习呀.哈哈哈.正在尝试爱上代码,虽然有一丢丢的难,不过,我相信我会的! [Ajax] Ajax技术的核心是XMLHttpRequest对象(简称HXR).Ajax通信与数据格式无关,这种技术就是无须刷新页面即可从服务器取得数据,但不一定是XML数据. [XMLHttpRequest对象] IE5是第一款引入XHR对象的浏览器.XHR对象是通过MSXML库中的一个ActiveX对象实

MVC跨域CORS扩展

CORS的原理: CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问.CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求.实现此功能非常简单,只需由服务器发送一个响应标头即可.      context.HttpContext.Response.AppendHeader("Access-Control-Allow-Origin", origin); 针对ASP.NET MVC,cors跨域访问,只需要在web.config中添加如下的内容即可 <syste

跨域CORS

一.跨域CORS是什么 当一个资源从与该资源本身所在的服务器的域或端口不同的域或不同的端口请求一个资源时,浏览器会发起一个跨域 HTTP 请求.出于安全考虑,浏览器会限制从脚本内发起的跨域HTTP请求或者拦截了服务器返回内容.例如,XMLHttpRequest 和 Fetch 遵循同源策略.因此,使用 XMLHttpRequest或 Fetch 的Web应用程序只能将HTTP请求发送到其自己的域:这种安全机制是为避免出现类似CSRF 跨站攻击等问题. 二.实现CORS 根据CORS的定义和W3C

Ajax之跨域请求

一.引子 我现在开启了两个django项目,分别叫Demo1和Demo2,Demo1中有一个路径'http://127.0.0.1:8000/index/',对应的视图是index视图返回一个index页面,页面中只有一个button按钮,按钮绑定了一个单击事件,点击之后会发送一个ajax请求,请求的路径为'http://127.0.0.1:8001/ajax/',Demo1的ip和端口号是:'http://127.0.0.1:8000/',Demo2的ip和端口号是:'http://127.0

AJAX及其跨域的主要解决方法

AJAX = Asynchronous JavaScript andXML(异步的 JavaScript 和 XML).通过在后台与服务器进行少量数据交换,使网页实现异步更新.要明白异步交互可以通过同步和异步的对比很容易明白: 同步交互,就是最常见的click-refresh模式,点一个连接或提交一个表单,然后就必须重载整个页面 异步交互,javascript根据返回的数据,不刷新页面而改变当前页面的显示,例如:新浪微博,百度地图. Ajax的异步交互从XMLHttpRequest这个对象开始,