Easywechat 与 CORS 的冲突?

问题描述:
全局 CORS 设置了header头,在使用 Easywechat 的时候不能正常响应。
具体描述如下:

使用laravel搭建了一个 api 服务,设置了全局中间件 cors,设置如下:

    return $next($request)->header('Access-Control-Allow-Origin','*')
            ->header('Access-Control-Allow-Methods','POST,GET,OPTIONS,PUT,DELETE')
            ->header('Access-Control-Allow-Headers','Content-Type,Accept,Authorization,X-Requested-With')
            ->header('Access-Control-Allow-Credentials', 'true');

这个时候安装了 Easywechat ,在验证token的时候查看日志报如下错误:

[2017-04-20 17:40:23] local.INFO: request arrived.  
[2017-04-20 17:40:23] local.INFO: return response.  
[2017-04-20 17:40:23] local.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Call to undefined method Symfony\Component\HttpFoundation\Response::header() in /data/appApi/app/Http/Middleware/CORS.php:32

之后注释掉 CORS 的全局中间件,验证成功。

问题是:如果在保证关闭验证跨域请求的情况下,让 Easywechat 跑起来呢?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
leo
最佳答案

@际遇 哦哦,我的失误

$resp = $next($request);
$resp->headers->add([
    'Access-Control-Allow-Origin'=>'*',
    'Access-Control-Allow-Methods'=>'POST,GET,OPTIONS,PUT,DELETE',
]);
return $resp;
7年前 评论
讨论数量: 13

Nginx或者public/index.php?想到比较简单粗暴的

7年前 评论

@to2False niginx那个比较麻烦啊 框架内没有实现的办法吗

7年前 评论
leo
$next($request)->headers->add([
    'Access-Control-Allow-Origin'=>'*',
    'Access-Control-Allow-Methods'=>'POST,GET,OPTIONS,PUT,DELETE',
]);
7年前 评论

@leo 按照您说的方式修改,查看日志报错如下
Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to Illuminate\Session\Middleware\StartSession::addCookieToResponse() must be an instance of Symfony\Component\HttpFoundation\Response, null given, called in /data/appApi/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php on line 72 in /data/appApi/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:172

7年前 评论
leo

@际遇 你是不是没加return……我这个只是示例代码……

7年前 评论

@leo 肯定加了呀
return $next($request)->headers->add([
'Access-Control-Allow-Origin'=>'*',
'Access-Control-Allow-Methods'=>'POST,GET,OPTIONS,PUT,DELETE',
'Access-Control-Allow-Headers' => 'Content-Type,Accept,Authorization,X-Requested-With',
'Access-Control-Allow-Credentials' => 'true'
]);

7年前 评论
leo

@际遇 哦哦,我的失误

$resp = $next($request);
$resp->headers->add([
    'Access-Control-Allow-Origin'=>'*',
    'Access-Control-Allow-Methods'=>'POST,GET,OPTIONS,PUT,DELETE',
]);
return $resp;
7年前 评论

@leo 非常感谢,可以了,为什么要这样修改呢?直接return会报错呢?

7年前 评论

@际遇 你看一下 add 的返回值是什么。

7年前 评论

中间件执行时机的问题,后return是说在请求处理后执行中间件

7年前 评论

Response 对象中是没有header方法的

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!