webman中间件部分执行

MarkGo

config\middleware.php

<?php
return [
    '' => [
        app\middleware\AccessControl::class,
        app\middleware\ActionHook::class,
    ],
];

config\route.php

<?php

Route::group('/front',function (){
    Route::group('/v1',function (){
        Route::group('/util',function (){
            Route::get('/init.json',[app\controller\v1\util::class,'init']);
            Route::post('/code2session',[app\controller\v1\util::class,'code2session']);
            Route::post('/addFav',[app\controller\v1\util::class,'addFav'])->middleware([
                app\middleware\chkLogin::class
            ]);
        });
    });
})->middleware([
    app\middleware\userInfo::class,
]);

访问addFav时,执行顺序为:
1--->app\middleware\ActionHook::class
2--->app\middleware\chkLogin::class
结束。

预期顺序:
1--->app\middleware\AccessControl::class
2--->app\middleware\ActionHook::class
3--->app\middleware\userInfo::class
4--->app\middleware\chkLogin::class

不知道为什么会跳过部分中间件执行,
其中AccessControl为跨域请求,请求类型为option时返回对应的,
测试的时候也发option过去,但返回404.
通过post的方式请求addFav,
执行了
ActionHook<---执行beforeAction和afterAction。确定执行了。
chkLogin<----检测登录状态用的,返回了未登录。

被忽略了的userInfo 尝试过了在里面输入任意内容,终端都没有输出,感觉就是没被调用到。

Workerman version:4.0.19
Webman 1.0.0

2687 1 1
1个回答

MarkGo

找到问题了。
AccessControl::class 没执行是因为 路由绑定的方式只有GET/POST,路由匹配不上,所以中间件没执行。
userInfo::class 没被执行是因为绑定到了最外层的group,路由绑定中间件只支持执行当层的绑定,上一层的都不会被执行。

解决方式:
1、存在跨域的需要执行OPTION的不要绑定GET/POST,绑定any。
2、路由分多级组的话,中间件只能绑定到最小的那个组,不能绑定上面的组

  • 暂无评论
年代过于久远,无法发表回答
🔝