国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

中間件往控制器傳參會導(dǎo)致跨域問題

shaonian820

在我使用多個中間件的時候。全局中間件使用的是跨域中間件,然后針對登錄驗證使用了路由中間件,中間件判斷用戶登錄成功以后獲取了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;
    }
2197 5 1
5個回答

2548a

估計是傳參導(dǎo)致出錯了,所以才報跨域問題的,自己仔細調(diào)試檢查下吧. 還有中間件的執(zhí)行順序問題導(dǎo)致的錯誤,確定是不是先執(zhí)行的跨域中間件再到驗證中間件

  • shaonian820 2022-02-08

    并沒有 本地測試使用postman請求并沒有問題。線上使用postman請求也沒有問題。可以獲取到參數(shù)。文檔里面也有注明執(zhí)行順序為:
    中間件執(zhí)行順序為全局中間件->應(yīng)用中間件->路由中間件。

  • shaonian820 2022-02-08

    當(dāng)我把$request->userData = Token::getAuthData($token);這行代碼注釋掉的時候,api接口請求是ok的 也沒有跨域問題。

  • 2548a 2022-02-08

    那你改成 $request->userData =1;你看看會不會還跑不下去呀

  • shaonian820 2022-02-08

    改為1...可以跑下去。。。。。但是不應(yīng)該呀,我里面加了判斷,若key不存在或者沒有數(shù)據(jù)的話 會拋出異常的來著。。。

  • 2548a 2022-02-08

    說明就是代碼層面的錯誤,一個可能是調(diào)用報錯,還有一個可能是執(zhí)行順序問題,如果option請求也訪問到了那里,是不是會報錯呢?如果報錯了option請求自然就失敗了,也就跨域失敗,無法進行正常請求了

  • shaonian820 2022-02-08

    剛剛一行一行調(diào)試了一下,就是代碼層面手動拋出了異常 throw new \Exception('登錄已超時,請重新登錄', 300),導(dǎo)致信息獲取失敗,然后前端就直接提示跨域了,option響應(yīng)是ok的 有
    Route::options('[{path:.+}]', function (){
    return response('');
    });攔截著

  • shaonian820 2022-02-08

    然后測試了一下。。發(fā)現(xiàn)在中間件里 不能手動拋異常。。。。

shaonian820

好了 處理了 目前在中間件里 針對代碼層面的異常開啟了try,然后出現(xiàn)異常的時候進行return response掉就Ok了

  • 暫無評論
MarkGo

Route::options('[{path:.+}]', function (){
return response('');
});

這行沒生效導(dǎo)致的,
我之前也遇到這個問題,只能在中間件里判斷請求是否options,options的話返回CORS信息不驗證token

  • shaonian820 2022-02-08

    但是不加這行的話,也會出現(xiàn)跨域問題。

  • MarkGo 2022-02-09

    這是因為沒走到這行,所以導(dǎo)致無法正確響應(yīng)cors信息,你直接把這行取消肯定也會出現(xiàn)跨域。

walkor 打賞

$request->userData = Token::getAuthData($token); 看起來是這行代碼出錯導(dǎo)致的。發(fā)生500錯誤后就會導(dǎo)致跨域錯誤。

  • shaonian820 2022-02-08

    是的,已經(jīng)處理了,但是在中間件手動拋出異常都會出現(xiàn)跨域錯誤。所以我開try 處理了。

  • walkor 2022-02-08

    拋出異常也是500錯誤,所以會有跨域錯誤

  • shaonian820 2022-02-08

    因為也做了異常處理,所以我的理解是,我拋出了異常,那么代碼也應(yīng)該走異常處理,然后響應(yīng)錯誤信息來著。

  • VAV 2022-07-29

    我也是在中間件中拋出異常就會導(dǎo)致跨域錯誤,很無奈啊

  • 愛吃魚 2022-07-30

    @walkor 目前中間件里返回的錯誤異常是直接return json返回錯誤信息。就會提示跨域問題。

Tinywan
$request->userData = Token::getAuthData($token);

Token 拋出異常

截圖

中間件

截圖

  • VAV 2022-07-29

    你這樣在中間件拋異常不會產(chǎn)生跨域嗎,我用的也是你的異常插件,然后自定義了一個異常,中間件中拋異常就會產(chǎn)生跨域

  • 愛吃魚 2022-07-30

    目前我也發(fā)現(xiàn)是有這個問題。

年代過于久遠,無法發(fā)表回答
??