背景知识:

我们会发现,在很多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计划。

解决问题:

在中间件中通过 $request->method() 进行判断,如果是 OPTIONS 方法,放行。否则,执行用户认证。
class ApiAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->method() !== 'OPTIONS') {
$token = $request->header('Token');
return response('Token: ' . $token, 401);
}
return $next($request);
}
}

最新文章

  1. lumia手机wp系统应用列表如何设置按照拼音
  2. Linux内核分析——进程描述与创建
  3. 从Eclipse迁移到Android Studio
  4. 别老扯什么Hadoop了,你的数据根本不够大
  5. Webpack使用教程三(webpack-dev-server)
  6. Enabling CORS in WCF
  7. IT人为什么难以拿到高薪?
  8. 关闭“编辑窗体”后, 主窗体的DatagridView刷新数据的问题
  9. poj3694Network(tarjan+lca)
  10. Android自定义标题TitleView
  11. Android TextView 手动上下滑动
  12. Linux新手笔记 源 安装chromium
  13. Win8.1应用开发之异步编程
  14. Ajax获取数据的几种格式和解析方式
  15. Robot Framework 源码解析(1) - java入口点
  16. C# 三种打印方式含代码
  17. WIMLIB-CAPTURE捕获说明
  18. bzoj 1015: [JSOI2008]星球大战starwar (逆向思维+并查集)
  19. 如何在一小时内更新100篇文章?-Evernote Sync插件介绍
  20. 所有JTAG集成电路都应该支持菊花链

热门文章

  1. 字符串,数组,定时器,form
  2. windows的类似shell 命令操作
  3. 数学公式 AS3应用
  4. UI5-文档-4.14-Custom CSS and Theme Colors
  5. jquery 阻止冒泡事件和阻止默认事件
  6. Recursion递归
  7. vim使用方法:
  8. linux 用户管理(3)----查看用户登录时间以及命令历史
  9. thymeleaf从session中获取数据
  10. 2014年可用的TRACKER服务器大全