博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AJAX 请求中多出了一次 OPTIONS 请求 导致 Laravel 中间件无法对 Header 传入的 Token 无法获取...
阅读量:4961 次
发布时间:2019-06-12

本文共 1225 字,大约阅读时间需要 4 分钟。

背景知识:

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

解决问题:

 
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); } }

转载于:https://www.cnblogs.com/mouseleo/p/8298844.html

你可能感兴趣的文章
【Marschner模型】Light Scattering from Human Hair Fibers人类头发纤维的光照散射
查看>>
实验一作业
查看>>
设置RDLC中table控件的表头在每页显示
查看>>
time及各种cpu时间
查看>>
MFC reference
查看>>
扎马步-计算机网络和系统基础知识
查看>>
64位/32位
查看>>
浅谈对Struts2上传文件的理解
查看>>
看完这篇分析,还不懂分布式事物,请给我差评
查看>>
C#中的委托和事件(续)
查看>>
Codeforces Round #445 Div. 2 A ACM ICPC+B Vlad and Cafes
查看>>
C# Excel数据导入到数据库
查看>>
c# 去除字符串中重复字符
查看>>
POJ 1147
查看>>
作品第三课----简单计算器
查看>>
贫血模型和充血模型
查看>>
Mui 微信支付、支付宝支付
查看>>
下拉框、多选框、单选框 通过TagHelper绑定数据
查看>>
卷积神经网络_(1)卷积层和池化层学习
查看>>
无责任共享 Coursera、Udacity 等课程视频(转载)
查看>>