在我使用多個中間件的時候。全局中間件使用的是跨域中間件,然后針對登錄驗證使用了路由中間件,中間件判斷用戶登錄成功以后獲取了redis里面的存儲的用戶信息,然后通過
$request->userData = Token::getAuthData($token);
return $next($request);
對控制器傳了參數(shù),但是這時候前端通過api請求對應(yīng)的路由就會出現(xiàn)跨域的問題,針對這個問題是如何解決好呢?屬于bug還是屬于代碼層面需要優(yōu)化呢?
注:只有走了這個登錄中間件的才會出現(xiàn)跨域問題,若不走登錄中間件的路由則不會出現(xiàn)跨域問題。
跨域中間件代碼:
public function process(Request $request, callable $next): Response
{
$response = $request->method() == 'OPTIONS' ? response('') : $next($request);
$response->withHeaders([
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' =>'GET,POST,PUT,DELETE,OPTIONS',
'Access-Control-Allow-Headers' => 'Content-Type,Authorization,X-Requested-With,Accept,Origin,Referer,User-Agent,token'
]);
return $response;
}
估計是傳參導(dǎo)致出錯了,所以才報跨域問題的,自己仔細調(diào)試檢查下吧. 還有中間件的執(zhí)行順序問題導(dǎo)致的錯誤,確定是不是先執(zhí)行的跨域中間件再到驗證中間件
并沒有 本地測試使用postman請求并沒有問題。線上使用postman請求也沒有問題。可以獲取到參數(shù)。文檔里面也有注明執(zhí)行順序為:
中間件執(zhí)行順序為全局中間件->應(yīng)用中間件->路由中間件。
當(dāng)我把$request->userData = Token::getAuthData($token);這行代碼注釋掉的時候,api接口請求是ok的 也沒有跨域問題。
說明就是代碼層面的錯誤,一個可能是調(diào)用報錯,還有一個可能是執(zhí)行順序問題,如果option請求也訪問到了那里,是不是會報錯呢?如果報錯了option請求自然就失敗了,也就跨域失敗,無法進行正常請求了
剛剛一行一行調(diào)試了一下,就是代碼層面手動拋出了異常 throw new \Exception('登錄已超時,請重新登錄', 300),導(dǎo)致信息獲取失敗,然后前端就直接提示跨域了,option響應(yīng)是ok的 有
Route::options('[{path:.+}]', function (){
return response('');
});攔截著
Route::options('[{path:.+}]', function (){
return response('');
});
這行沒生效導(dǎo)致的,
我之前也遇到這個問題,只能在中間件里判斷請求是否options,options的話返回CORS信息不驗證token