AJAX 请求中多出了一次 OPTIONS 请求 导致 Laravel 中间件无法对 Header 传入的 Token 无法获取
2018-01-16 21:15
1736 查看
背景知识:
我们会发现,在很多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);
}
}
相关文章推荐
- laravel框架下 前后端分离开发时 通过AJax请求单独获取加密后的csrf_token
- 客户端ajax请求为实现Token验证添加headers后导致正常请求变为options跨域请求解决方法
- 使用ajax跨域请求时,后台无法获取到token
- bug 由于浏览器缓存而引起的ajax请求并没有获取到服务器最新数据从而导致的bug
- SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析
- IE8浏览器缓存问题导致Ajax的GET请求只能执行一次的解决办法
- laravel深入-IOC容器、一次请求过程、中间件
- ajax请求获取的数据无法赋值给全局变量问题总结
- 关于laravel发送ajax请求带headers头时(防止csrf),报错Warning: Cannot modify header information - headers already se
- Form表单中的button导致页面刷新而无法进入Ajax请求回调函数
- 页面使用$.getJSON只获取一次数据,导致多个请求返回的都是第一个结果
- SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析
- ssm中关于ajax发送PUT请求导致数据无法封装,出现sql语句错误
- ajax开发:在ajax请求后台时在请求标头RequestHeader加token
- 一次偶然的ajax请求导致status为canceled的原因
- Laravel与ajax请求token
- 解决Ajax请求时 无法获取最新数据
- ajax开发:在ajax请求后台时在请求标头RequestHeader加token
- laravel5.4通过ajax提交表单获取到422返回,ajax无法捕获返回内容
- 关于IEajaxpost请求无法获取数据的BUG