了解前端跨域知识

1. 跨域是什么?

跨域,是指浏览器不能执行其他网站的脚本。

2. 为什么会产生跨域?

因为浏览器的同源策略(Same Origin Policy),对 JavaScript 实施了安全限制。非同一域名、协议、端口的请求,是不被浏览器允许的(浏览器会将该请求返回的响应内容拦截,并给出跨域警告)。

3. 只要非同源的请求都会受限制么?

跨域的限制行为是仅存在于浏览器的。这也就是为什么会出现通过 API 请求工具调用接口的时候没有问题,但通过浏览起发起请求时就会出现跨域警告。

4. 跨域请求,浏览器会做什么?

  • 请求发出
  1. 简单请求请求方法:GET、HEAD、POST
    请求头部字段:Accept、Accept-Language、Content-Language、Content-Type(只能是这三个值之一:application/x-www-form-urlencoded、multipart/form-data、text/plain)、Last-Event-ID、不包括自定义头部字段。(好长一堆T.T,不用硬背,大概知道是这个意思就行了8⃣️)表现: 判定为简单请求的话,请求会被直接发出
  2. 非简单请求
    请求方式:PUT、DELETE、PATCH等
    包含自定义头部字段等……
    (我理解就是不满足简单请求的话,就是非简单请求)表现: 在请求发起时,浏览器为了确认服务端是否支持客户端发起非简单请求,会先发出一次预检请求(preflight request),请求方法为 OPTIONS,确认服务端允许该请求后,浏览器才会发出真实的请求
  • 响应返回在浏览器接收到响应后,会校验以下响应头中的字段,确认服务端是否允许本次跨域请求:
    1. Access-Control-Allow-Origin(服务端设置的允许共享资源的源): 是否包含该请求源或者设置为所有源。
    2. Access-Control-Allow-Methods(服务端设置的允许请求资源的方法): 是否包含本次请求方法。
    3. Access-Control-Allow-Headers(服务端设置的允许携带的请求头部字段): 该请求头字段是否超出了设置范围则。
    4. Access-Allow-Max-Age(本次预检请求的有效时长): 如果设置了且未超过有效时长,则不用重复发送预检请求。
    表现:
    • 满足服务器设置时,简单跨域请求返回响应数据,非简单跨域请求发送后续的真实请求(后续响应的处理和上述相同)。
    • 不满足服务器设置时,简单跨域请求返回的响应数据会直接被浏览器拦截,抛出跨域错误。非简单跨域请求发送的预检请求确认服务端不允许该请求,则会忽略后续请求,不发送真实请求。

5. 如何解决跨域限制

  1. JSONP浏览器允许嵌入跨域资源的请求:

你可能感兴趣的:(java,http,ajax,js,web)