美文网首页
记一次跨越请求的问题

记一次跨越请求的问题

作者: __youzhiyong | 来源:发表于2017-11-19 16:09 被阅读0次

问题简介:在我发送post请求之前,浏览器总是会多发送一个option请求,而由于我们的Nginx服务器直接屏蔽了options请求,导致options请求失败,进而导致后面的请求无法发送。
我们都知道请求分为同源请求和跨源请求,而我们常用的AJAX只能用于同源请求,要想跨域,我们可以使用JSONP,CORS, WebSocket来实现。本文主要来带大家简单了解下CORS。

CORS是跨域资源共享(Cross-origin resource sharing)的简称

CORS请求需要浏览器和服务端同时支持。
CORS的请求分为简单请求非简单请求两类。

简单请求

被称为简单请求的条件:

(1) 请求方法是以下三种方法之一:
    HEAD
    GET
    POST
(2)HTTP的头信息不超出以下几种字段:
    Accept
    Accept-Language
    Content-Language
    Last-Event-ID
    Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

对于简单请求,浏览器会在其请求头部中增加一个Origin字段,

Orgin: http://example.com:10000

来说明这个请求来自哪个源(即请求来自哪里,协议+域名+端口),当服务器收到这个请求,会查看请求的origin字段,根据源来判断是否允许该跨域请求。
若允许,则会在返回的头部信息中加上:

Access-Control-Allow-Origin: http://example.com:10000

该字段表示该跨域请求被允许。
若不允许,也会正常返回一个HTTP Response,但是Header中不包括此字段。这时浏览器收到后就会知道请求失败(即使HTTP回应的状态码是200)。

非简单请求

不符合简单请求要求的被称为非简单请求。
对于非简单请求,会在真正请求之前先发送一个options请求,称之为预请求,这就是为什么我们在开发的时候明明没有发送过什么options类型的请求却经常看到的原因。预请求的作用是用来询问后面真正的请求是否被许可,预请求很简单,有三个主要的字段:

origin: http://example.com:10000
Access-Control-Request-Method: post
Access-Control-Request-Headers: auth-token

分别表示请求的源,真正请求的方式,真正请求的额外头信息字段(多个用逗号分开),服务器端收到预请求后,会检查这三个字段,确认允许后会在头部返回如下信息:

Access-Control-Allow-Origin: http://example.com:10000
Access-Control-Allow-Methods: get, post, put, delete
Access-Control-Allow-Headers: auth-token

如没有这三个字段,则表示不允许后面真正的请求,则浏览器不会继续发送真正的请求;有则表示允许,被允许后,则会像发送简单请求那样发送真正的请求。

参考链接
同源政策及其避规方法 http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html
CORS详解 http://www.ruanyifeng.com/blog/2016/04/cors.html

相关文章

  • 记一次跨越请求的问题

    问题简介:在我发送post请求之前,浏览器总是会多发送一个option请求,而由于我们的Nginx服务器直接屏蔽了...

  • 记使用axios请求easy-mock数据时碰到的问题

    记使用axios请求easy-mock数据时碰到的问题 第一次使用axios带参数来请求easy-mock模拟的数...

  • JSONP跨越请求

    functioncheck(){ $.ajax({ type:"GET",//jsonp只支持get方式 url:...

  • vue 解决跨域

    vue 请求数据,总结下vue跨越问题 第一种.服务器服务器不支持跨域请求 1.当跨域无法请求的时候我们可以工程目...

  • 医美腰腹塑形 甩掉臃肿体态

    【前 记】 “每个律师,至少会有那么一次,尝试跨越他从来未曾想到过的界限。然而,当这种跨越不断出现时,那道界线就此...

  • 非简单跨越请求

    当浏览器发现请求是跨越的时候,会先进行预检请求,之后才会进行第二次请求来获取数据。 1. 预检"请求用的请求方法是...

  • http跨域预检问题

    昨天的项目碰到个比较棘手的问题。前端发送ajax请求时,总会在真实请求前多一次请求方法为OPTIONS的请求,而且...

  • 为 HTTP API 接口增加统一请求日志

    概述 增加请求日志,便于在开发阶段,追查错误,在将来上线后,进行线上问题的排查。 统一请求日志要完成以下功能: 记...

  • 记一次网络请求耗时问题分析解决过程

    一、问题背景 两个月前的一个版本需要对接腾讯会议相关接口,需要接收腾讯会议事件变更回调,腾讯会议通过webhook...

  • 记一次 CORS 跨域请求出现 OPTIONS 请求的问题及解决

    今天前后端在联调接口的时候,发生了跨域请求资源获取不到的问题。首先说明下跨域问题的由来。引自HTTP 访问控制 的...

网友评论

      本文标题:记一次跨越请求的问题

      本文链接:https://www.haomeiwen.com/subject/gztpvxtx.html