zoukankan      html  css  js  c++  java
  • 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获得的回应是拒绝性质的,比如404403500等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 IlluminateHttpRequest $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);
    }
    }
  • 相关阅读:
    kafka整理笔记笔记
    node(一)安装nodejs最新版到debian,ubuntu,mint系统
    ubuntu16.04安装visual-studio-code
    ubuntu16.04更新内核--使用4.6以上的内核会让用A卡的Dell电脑更快--及卸载多余内核
    linux查看主板型号及内存硬件信息,及硬盘测速
    git使用,在ubuntu中
    Ubuntu中文目录文件夹改为英文
    w3m 在ubuntu中的使用
    关于右键属性与du -sh显示的文件大小不一致的解决
    ubuntu16.04安装chrome
  • 原文地址:https://www.cnblogs.com/mouseleo/p/8298844.html
Copyright © 2011-2022 走看看