webman中间件部分执行

0

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

已邀请:

MarkGo

赞同来自:

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


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

要回复问题请先登录注册