跨域请求不经过应用插件的中间件

sudden3

已解决

感谢老大,原因为注册options路由的Route::options('[{path:.+}]', function () {});写法为匿名函数,而webman判断路由是否为属于应用插件是由命名空间判断的,匿名函数没有这些东西 所以就没有走应用插件的中间件.

问题描述

应用插件中配置了中间件处理跨域请求,发现请求没有经过中间件。

这里粘代码

应用插件中的config/middleware.php截图
截图
中间件代码截图
截图
应用插件中route.php代码截图
截图

报错信息

发送请求后:
options请求没报错 但是响应头不全,控制台只输出了"option router"未输出"corsMiddleware"
截图

post请求报错 控制台无任何输出
截图

程序代码

--

操作系统及workerman/webman等框架组件具体版本

这里写具体的系统环境相关信息

744 3 0
3个回答

sudden3

截图

  • 暂无评论
sudden3

更新一下 我继续调试的过程

我给中间件加了一个构造函数参数 如图:
截图
然后再在config/middleware.php/应用插件目录/config/middleware.php分别都引入了这个中间件并传入不同的参数:

[
    '' => [
      new \plugin\RainAdmin\app\middleware\CorsMiddleware("项目中间件") // 或'应用插件中间件'
    ]
]

请求的目标控制器方法(控制器存在于应用插件内):

public function login(Request $request) {
    return json(["data" => 123]);
}

发起请求后发现浏览器中请求成功返回了结果,控制台的输出为:

项目中间件----OPTIONS---- Before 
项目中间件----OPTIONS---- After 
应用插件中间件----POST---- Before 
应用插件中间件----POST---- After 

预检请求在项目中间件中直接被返回了(代码逻辑控制的我能理解),但是为什么POST请求没有经过项目中间件...


我又再次测试,将项目/config/middleware.php中引入的中间件注释掉,发现POST直接请求不通了,控制栏中输出为空 但是OPTIONS请求依然可以请求通(这就是开贴时的情况)。


我再次测试 将注释的中间件恢复,把控制器中的方法改写为了:

public function login(Request $request) {
    throw new BusinessException("test");
}

结果请求又不通了,浏览器报CORS错误,控制台输出为:

项目中间件----OPTIONS---- Before 
项目中间件----OPTIONS---- After 
应用插件中间件----POST---- Before 
应用插件中间件----POST---- After

我将应用插件内的middleware.php中引入中间件的代码注释后请求又正常了。

控制台中输出

项目中间件----OPTIONS---- Before 
项目中间件----OPTIONS---- After 

注:我在应用插件内exception.php指定了异常处理类并在response中加入了中间件中同样的响应头
截图

  • 暂无评论
walkor

精简一个能重现问题的项目,zip打包发到我邮箱 walkor@workerman.net

年代过于久远,无法发表回答
🔝