我们会发现,在很多post,put,delete等请求之前,会有一次options请求。

根本原因就是,W3C规范这样要求了!在跨域请求中,分为简单请求(get和部分post,post时content-type属于application/x-www-form-urlencoded,multipart/form-data,text/plain中的一种)和复杂请求。而复杂请求发出之前,就会出现一次options请求。

什么是options请求呢?它是一种探测性的请求,通过这个方法,客户端可以在采取具体资源请求之前,决定对该资源采取何种必要措施,或者了解服务器的性能。

在ajax中出现options请求,也是一种提前探测的情况,ajax跨域请求时,如果请求的是json,就属于复杂请求,因此需要提前发出一次options请求,用以检查请求是否是可靠安全的,如果options获得的回应是拒绝性质的,比如404\403\500等http状态,就会停止post、put等请求的发出。

虽然在下面的参考文献中有人提出可以取消options请求,但是实测后发现是不行的,jquery封装之后,更不能轻易取消。因此,靠javascript客户端取消options请求是不可能的,只能通过服务端对options请求做出正确的回应,这样才能保证options请求之后,post、put等请求可以被发出。但是,我们不能允许所有的options请求,而应该是有条件的,所以最好是通过一个特殊的机制,去验证客户端发出的options请求数据是否是符合服务端的条件的,如果不满足,返回403,则客户端会取消原有的post计划。

前台跨域post请求,由于CORS(cross origin resource share)规范的存在,浏览器会首先发送一次options嗅探,同时header带上origin,判断是否有跨域请求权限,服务器响应access control allow origin的值,供浏览器与origin匹配,如果匹配则正式发送post请求。

如果有服务器程序权限,设置,比如jsp中,设置header access control allow origin等于*,就可以得到跨域访问的目的。

摘于 “青春阳光的岁月” 的博客

最新文章

  1. Atitit 深入理解耦合Coupling的原理与attilax总结
  2. [CoreOS 转载] CoreOS实践指南(六):分布式数据存储Etcd(下)
  3. mac下用ruby安装sass && webstorm下给scss文件添加watch
  4. Cocopod上更新上传自己的开源框架供别人下载
  5. 【转】Fiddler 教程
  6. Part 93 Protecting shared resources from concurrent access in multithreading
  7. Delphi 串口通信(1)
  8. injector
  9. poj1417菜鸡的详细题解(希望能帮助到和我一样陷于本题的新手)
  10. 【面试笔试算法】Program 4 : Best Compression Algorithms(网易游戏笔试题)
  11. hdu-2328(暴力枚举+kmp)
  12. android 控件设置透明度
  13. Jmeter中通过beanshell写入CSV的脚本
  14. 信息系统项目管理师EV、PV、AC、BAC、CV、SV、EAC、ETC、CPI、SPI概念说明
  15. POJ1038 Bugs Integrated, Inc.
  16. String 的常用操作
  17. django基于cors做跨域处理
  18. python怎么解决用matplotlib画图时无法显示中文的问题或者出现方框的问题
  19. ubuntu安装meshlab
  20. JS获取 KindEditor textarea 标签 html内容失败的解决方法。

热门文章

  1. Jmeter-逻辑控制器之Switch控制器(Switch Controller)
  2. loj #6235. 区间素数个数 min_12.5筛
  3. DP【洛谷P2363】马农
  4. 【NOIP 2009】最优贸易
  5. [HAOI2006]受欢迎的牛 tarjan缩点 BZOJ1051
  6. P3796 【模板】AC自动机
  7. Go语言基础之10--面向对象编程2之方法
  8. SQL Server 数据导入与导出
  9. C++ vector类型要点总结(以及各种algorithm算法函数)
  10. 搭建python开发环境