http://www.tangshuang.net/2271.htmljavascript
在上一篇《服务端php解决jquery ajax跨域请求restful api问题及实践》中,我简单介绍了如何经过服务端解决jquery ajax的跨域请求问题,可是,在这个过程当中,咱们会发现,在不少post,put,delete等请求以前,会有一次options请求。本文主要是来讨论一下这是什么缘由引发的。php
根本缘由就是,W3C规范这样要求了!在跨域请求中,分为简单请求(get和部分post,post时content-type属于application/x-www-form-urlencoded,multipart/form-data,text/plain中的一种)和复杂请求。而复杂请求发出以前,就会出现一次options请求。html
什么是options请求呢?它是一种探测性的请求,经过这个方法,客户端能够在采起具体资源请求以前,决定对该资源采起何种必要措施,或者了解服务器的性能。java
在ajax中出现options请求,也是一种提早探测的状况,ajax跨域请求时,若是请求的是json,就属于复杂请求,所以须要提早发出一次options请求,用以检查请求是不是可靠安全的,若是options得到的回应是拒绝性质的,好比404\403\500等http状态,就会中止post、put等请求的发出。jquery
虽然在下面的参考文献中有人提出能够取消options请求,可是实测后发现是不行的,jquery封装以后,更不能轻易取消。所以,靠javascript客户端取消options请求是不可能的,只能经过服务端对options请求作出正确的回应,这样才能保证options请求以后,post、put等请求能够被发出。可是,咱们不能容许全部的options请求,而应该是有条件的,因此最好是经过一个特殊的机制,去验证客户端发出的options请求数据是不是符合服务端的条件的,若是不知足,返回403,则客户端会取消原有的post计划。ajax