说明
在以下的这些特殊场景下,我们需要关闭 Laravel Session 的生成:
测试环境下;
特殊逻辑下,如你想未登录用户不创建会话信息
在 5.3 里有非常棒的 中间件组 功能可以来处理此类问题,接下来介绍适用于 5.1 的方法。
测试环境下
在运行测试时,Laravel 会自动将环境变量设置为 testing,并将 Session 及缓存以 数组 的形式存入,也就是说在测试时不会保存任何的 Session 或缓存数据。
也就是说我们什么都不需要做。
未登录用户情况下关闭 Session
原理:从上面测试环境的讲解中,我们知道了将 Session 驱动设置为 数组 的形式存入,就不会保存任何的 Session 数据。
利用这个原理,我们在可以新增一个全局中间件,在此中间件中将 Session 驱动设置为 数组,并且此中间件运行在 StartSession 中间件之前即可。
一、注册全局中间件
注意要放在 StartSession
之前:
protected $middleware = [
...
\App\Http\Middleware\DisableSessionMiddleware::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
];
二、书写代码
DisableSessionMiddleware
类的代码如下:
<?php
namespace App\Http\Middleware;
use Closure;
class DisableSessionMiddleware
{
public function handle($request, Closure $next)
{
// 如果是未登录用户的话,关闭 Session 记录
if (!Auth::check() && !$request->is('auth/*') ) {
config()->set('session.driver', 'array');
}
return $next($request);
}
}
三、关闭 CSRF 认证
修改 VerifyCsrfToken
类:
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
public function handle($request, Closure $next)
{
// 如果是未登录用户的话,关闭 CSRF 认证
if (!Auth::check()) {
return $next($request);
}
return parent::handle($request, $next);
}
}