AJAX 请求中多出了一次 OPTIONS 请求 导致 Laravel 中间件无法对 Header 传入的 Token 无法获取
背景知识:
我们会发现,在很多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);
}
}
最新文章
- lumia手机wp系统应用列表如何设置按照拼音
- Linux内核分析——进程描述与创建
- 从Eclipse迁移到Android Studio
- 别老扯什么Hadoop了,你的数据根本不够大
- Webpack使用教程三(webpack-dev-server)
- Enabling CORS in WCF
- IT人为什么难以拿到高薪?
- 关闭“编辑窗体”后, 主窗体的DatagridView刷新数据的问题
- poj3694Network(tarjan+lca)
- Android自定义标题TitleView
- Android TextView 手动上下滑动
- Linux新手笔记 源 安装chromium
- Win8.1应用开发之异步编程
- Ajax获取数据的几种格式和解析方式
- Robot Framework 源码解析(1) - java入口点
- C# 三种打印方式含代码
- WIMLIB-CAPTURE捕获说明
- bzoj 1015: [JSOI2008]星球大战starwar (逆向思维+并查集)
- 如何在一小时内更新100篇文章?-Evernote Sync插件介绍
- 所有JTAG集成电路都应该支持菊花链