我使用离子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
标头,您将不会 能够使用上述步骤解决限制。你呢 除非你有控制权,否则根本无法解决这个问题 正在进行请求的服务器。
有没有其他方法/最佳做法来处理这个?
答案 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(){});
});