首页 专题 文章 代码 归档

解决Laravel的跨域和CSRF问题

1. 跨域问题

先说跨域问题吧,跨域问题原理/原因这里就不多说了,感兴趣可以百度;

在Laravel中,有很多额外扩展可以解决问题,但是麻烦,而且也许有兼容性问题;

其实还有一个更为简单的方法,中间件,对,没错,自定义一个中间件即可解决;


1、定义一个中间件(通过artisan命令可创建)

php artisan make:middleware CorsMiddleware

2、然后在此类的handle方法写入如下代码:

$response = $next($request);
$response->header('Access-Control-Allow-Origin', '*');
$response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept');
$response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
$response->header('Access-Control-Allow-Credentials', 'false');

return $response;

注:以上写的跨域要求很“宽松”,可根据自己的要求修改;

3、注册此中间件

app/Http/Kernel.php$routeMiddleware数组中注册就行:

protected $routeMiddleware = [
    //...其他中间件
    'cors' => CorsMiddleware::class,
];

截图-1582861245

4、在web.php中使用此中间件即可:

类似如下:

Route::group([ 'middleware' => 'cors'], function () {
//........
    });

2. CSRF问题

csrf本意是解决跨站提交表单的安全问题,也即POST数据的安全问题;

但是,如果是一个接口,需要post传递数据,那么还要验证csrf,明显不可行;

这里提供一个简单的办法:

app/Http/Middleware/VerifyCsrfToken.php的文件里有一个数组:

protected $except = [
    '/test/test',
    '/api/*',
    '/api/sp/*',
];

你只需要添加你不想验证csrf的路径就行(相对于根目录的路径,也即绝对路径,如上);

注:我并不知道是否支持*匹配,可自己测试;

此文阅读完毕,您可以:分享
二维码图片 扫描关注我们哟