laravel优化技巧一 如何在某些场景下关闭 Laravel 的自动 Session 会话生成

说明

在以下的这些特殊场景下,我们需要关闭 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);
    }
}
HTTPROOT | 自学PHP | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 石头哥 |微信小程序 |木讯 |备案
Copyright © 1998 - 2016 HTTPROOT.COM. All Rights Reserved httproot.com 版权所有