咱们会发现,在不少post,put,delete等请求以前,会有一次options请求。javascript
根本缘由就是,W3C规范这样要求了!在跨域请求中,分为简单请求(get和部分post,post时content-type属于application/x-www-form-urlencoded,multipart/form-data,text/plain中的一种)和复杂请求。而复杂请求发出以前,就会出现一次options请求。java
什么是options请求呢?它是一种探测性的请求,经过这个方法,客户端能够在采起具体资源请求以前,决定对该资源采起何种必要措施,或者了解服务器的性能。jquery
在ajax中出现options请求,也是一种提早探测的状况,ajax跨域请求时,若是请求的是json,就属于复杂请求,所以须要提早发出一次options请求,用以检查请求是不是可靠安全的,若是options得到的回应是拒绝性质的,好比404\403\500等http状态,就会中止post、put等请求的发出。ajax
虽然在下面的参考文献中有人提出能够取消options请求,可是实测后发现是不行的,jquery封装以后,更不能轻易取消。所以,靠javascript客户端取消options请求是不可能的,只能经过服务端对options请求作出正确的回应,这样才能保证options请求以后,post、put等请求能够被发出。可是,咱们不能容许全部的options请求,而应该是有条件的,因此最好是经过一个特殊的机制,去验证客户端发出的options请求数据是不是符合服务端的条件的,若是不知足,返回403,则客户端会取消原有的post计划。json
前台跨域post请求,因为CORS(cross origin resource share)规范的存在,浏览器会首先发送一次options嗅探,同时header带上origin,判断是否有跨域请求权限,服务器响应access control allow origin的值,供浏览器与origin匹配,若是匹配则正式发送post请求。跨域
若是有服务器程序权限,设置,好比jsp中,设置header access control allow origin等于*,就能够获得跨域访问的目的。浏览器