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

webman按照手冊(cè)來,在中間件中配置了跨域,但是請(qǐng)求的時(shí)候還是出現(xiàn)了404問題

bang

以下是中間件代碼:

<?php
namespace support\middleware;

use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;

/**
 * 跨域測(cè)試
 * Class AccessControl
 * @package support\middleware
 */
class AccessControl implements MiddlewareInterface
{
    public function process(Request $request, callable $next) : Response
    {
        /** @var Response $response */
        $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',
        ]);
        return $response;
    }
}

config目錄下的配置

<?php
return [
    '' => [
        support\middleware\AccessControl::class
    ]
];

前端請(qǐng)求代碼(使用了Jquery):

$.ajax({
            url : 請(qǐng)求地址,
            type : "post",
            dataType : 'JSON',
            data : data.field,
            success : function(response){

            },
            error : function (err) {

            }
        });

但是瀏覽器的ajax請(qǐng)求出錯(cuò)

跨域的問題沒辦法解決,是不是哪一步操作錯(cuò)誤了呢?

7611 7 2
7個(gè)回答

walkor 打賞

路由配置貼下。

  • bang 2020-08-22

    <?php
    namespace app\route;
    use Webman\Route;
    Route::post('/login' , 'app\admin\controller\Auth\Admin@login');
    路由代碼,其他的沒有動(dòng)過

bang
<?php
namespace app\route;

use Webman\Route;

Route::post('/login' , 'app\admin\controller\Auth\Admin@login');

這個(gè)是我路由代碼

  • bang 2020-08-22

    用postman請(qǐng)求是沒有問題的,意味著路由配置應(yīng)該是沒有問題

  • walkor 2020-08-22

    用 Route::any(),截圖里瀏覽器發(fā)起的是OPTIONS請(qǐng)求,不是post

  • bang 2020-08-24

    @1:any方法中并不包括OPTIONS,我手動(dòng)在Route.php文件加上去之后,請(qǐng)求會(huì)直接轉(zhuǎn)發(fā)到控制器邏輯,這樣不符合CORS邏輯,OPTIONS是瀏覽器發(fā)起一種“試探”吧,不應(yīng)該直接轉(zhuǎn)發(fā)到控制器。由于回復(fù)發(fā)不了圖,我在下面再發(fā)圖吧。

bang

修改前的any方法


    public static function any($path, $callback)
    {
        static::addRoute(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD' ], $path, $callback);
    }

修改后的any方法

    public static function any($path, $callback)
    {
        static::addRoute(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD' , 'OPTIONS'], $path,  $callback);
    }

請(qǐng)求修改前的any,結(jié)果如提問一樣是404

截圖

請(qǐng)求修改后的any,結(jié)果如下圖,請(qǐng)求直接就訪問到了業(yè)務(wù)邏輯,由于OPTIONS是不帶任何的業(yè)務(wù)參數(shù)的,所有很大可能會(huì)報(bào)錯(cuò)。

截圖

  • 暫無(wú)評(píng)論
walkor 打賞

升級(jí)下webman-framework,webman-framework從1.0.1開始路由增加了options支持。

所以你的路由應(yīng)該設(shè)置為:

Route::options('/login' , function(){
    return response('');
});
Route::post('/login' , 'app\admin\controller\Auth\Admin@login');

這樣將options路由和post路由分開,options路由就不用處理業(yè)務(wù)邏輯了。

  • bang 2020-08-24

    是不是項(xiàng)目中每個(gè)跨域api接口(幾乎全部都是)都得做同樣OPTIONS的路由?

walkor 打賞

是不是項(xiàng)目中每個(gè)跨域api接口(幾乎全部都是)都得做同樣OPTIONS的路由?

你可以直接在中間件里判斷下當(dāng)前是否是options請(qǐng)求,如果是則直接返回跨域header,不繼續(xù)執(zhí)行正常邏輯。這樣就不用每個(gè)接口都設(shè)置options路由。中間件代碼類似如下:

class AccessControl implements MiddlewareInterface
{
    public function process(Request $request, callable $next) : Response
    {
        /** @var Response $response */
        if ($request->method() == 'OPTIONS') {
            response = response('');
        } else {
            $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',
        ]);
        return $response;
    }
}

再說說options請(qǐng)求
瀏覽器在特定情況下才會(huì)發(fā)起opitons請(qǐng)求。

1. 使用了下面任一HTTP 方法:  
PUT/DELETE/CONNECT/OPTIONS/TRACE/PATCH
2. 人為設(shè)置了以下集合之外首部字段: 
Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width
3. Content-Type 的值不屬于下列之一:  
application/x-www-form-urlencoded、multipart/form-data、text/plain

一般情況下ajax請(qǐng)求不會(huì)觸發(fā)options請(qǐng)求。我這里經(jīng)過測(cè)試,在ajax里參數(shù)設(shè)置contentType:'application/json'時(shí),會(huì)觸發(fā)options請(qǐng)求。

$.ajax({
            url : '地址',
            type : "post",
            contentType:'application/json', // 這里
            success : function(response){},
            error : function (err) {}
        });

如果你的項(xiàng)目發(fā)起了options請(qǐng)求,可以看下是符合哪個(gè)條件觸發(fā)的,是否可以避免。

  • bang 2020-08-24

    感謝,升級(jí)和配置中間件之后,是可以了。我看fast-route是支持group的,但是webman沒把group這個(gè)方法封裝進(jìn)去,慢慢來吧。祝webman發(fā)展越來越好??!

bang

反復(fù)測(cè)試過之后,由于文檔中沒說明框架的生命周期。我測(cè)過之后,發(fā)現(xiàn)請(qǐng)求后,先是路由再到中間件的。也就是說,其實(shí)在中間件中判斷請(qǐng)求方式是否為OPTIONS不重要了。因?yàn)楫?dāng)ajax觸發(fā)OPTIONS請(qǐng)求時(shí),如果在路由文件沒有寫OPTIONS的對(duì)應(yīng)路由時(shí),就直接會(huì)報(bào)404,不會(huì)到中間件里面去了。代碼如下:

<?php
Route::options('/login' , function(){
    return response('');
});
Route::post('/login' , 'app\admin\controller\Auth\Admin@login');

這樣又回到了所有的路由都寫一遍OPTIONS的路由的情況了,這樣很累贅

問題如何重現(xiàn)?

請(qǐng)求時(shí),代碼如下:

$.ajax({
            url : routeUrl.login,
            type : "post",
            dataType : 'JSON',
            data : data.field,
            header:{token:'12312321'},
            success : function(response){
            },
            error : function (err) {
                console.log(err)
            }
        });
  • 暫無(wú)評(píng)論
bang

以下為個(gè)人的解決方法:
找到以下文件:vendor/workerman/webman-framework/src/App.php
在onMessage方法中添加一下代碼:

public function onMessage(TcpConnection $connection, $request)
{
        //添加以下代碼
        if($request->method() == 'OPTIONS'){
            $response = response('');
            //規(guī)則自己定
            $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, Authorization, Headers, token',
                'Access-Control-Request-Headers' => 'Headers, token',
            ]);
            static::send($connection, $response, $request);
            return null;
        }

    .....以下為官方代碼,省略
}

然后重新開啟workerman,完成?。?!

  • walkor 2020-08-25

    用 Route::any(),然后中間件里判斷OPTIONS就好了

  • bang 2020-08-25

    @1:使用any()也是可以,這個(gè)得看看業(yè)務(wù)邏輯需要吧

  • elibool 2021-10-11

    樓主的方法有效,但需要和 walkor 大佬的 app/middleware/AccessControlTest.php 中間件一起配合使用; view 前后端分離環(huán)境 ( jquery ajax , postman 無(wú)上述跨域問題)

年代過于久遠(yuǎn),無(wú)法發(fā)表回答
??