如何处理laravel中的预检请求

时间:2018-04-07 15:58:56

标签: angularjs laravel ionic-framework ionic3 laravel-5.5

我使用离子v-3 app和laravel 5.5作为后端 我的离子应用程序中有一个get请求

const httpOptions = {
  headers: new HttpHeaders({
    'Authorization':  'Bearer '+localStorage.getItem('token')
  })
};
this.prf=this.httpClient.get('http://localhost/blog/public/api/user',httpOptions);

首先发送OPTION请求,然后在获得成功回复后发送GET请求

现在我通过使用两个路由

在我的api.php文件中处理此问题
//first routing

Route::middleware('cors','auth:api')->get('/user', function (Request $request) {
return $request->user();
});

//second routing

Route::options('user', function(){
return response(200);
})->middleware('cors');

这是正常的

我的requset标题包含Access-Control-Request-Method: GET

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Access-Control-Request-Headers: authorization
Access-Control-Request-Method: GET
Connection: keep-alive
Host: localhost
Origin: http://localhost:8100
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Mobile 
Safari/537.36

在本文中,它说https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

  

但是,如果请求是由于该请求而触发预检的请求   请求中存在Authorization标头,您将不会   能够使用上述步骤解决限制。你呢   除非你有控制权,否则根本无法解决这个问题   正在进行请求的服务器。

有没有其他方法/最佳做法来处理这个?

2 个答案:

答案 0 :(得分:0)

您不必设置路线并处理预检请求。你这样做的方式是错误的。根据{{​​3}},预检请求用于描述目标服务器的通信选项。

请从服务器中删除Route::options路由。

答案 1 :(得分:0)

我找到了解决方案。

创建了中间件app/Http/Middleware/PreflightResponse.php

<?php
namespace App\Http\Middleware;
use Closure;
class PreflightResponse
{
    /**
    * Handle an incoming request.
    *
    * @param \Illuminate\Http\Request $request
    * @param \Closure $next
    * @return mixed
    */
    public function handle($request, Closure $next )
    {
        if ($request->getMethod() === "OPTIONS") {
            return response('');
        }
return $next($request);
     }
 }

添加app/Http/Kernel.php

'preflight' => \App\Http\Middleware\PreflightResponse::class, 

但仍然在我的api.php我必须使用这些代码

Route::middleware('cors','preflight')->group(function () {
    Route::options('register', function(){});
    Route::options('login', function(){});
    Route::options('address', function(){});
    Route::options('address/{id}', function(){});
    Route::options('getaddress', function(){});
    Route::options('getorders', function(){});
    Route::options('order', function(){});
    Route::options('orderdetails', function(){});
    Route::options('user', function(){});
    Route::options('profile', function(){});
    Route::options('calendar', function(){});
    Route::options('calendarapp', function(){});
});