【问题标题】:How to get rid of laravel_session cookie from Laravel application?如何从 Laravel 应用程序中删除 laravel_session cookie?
【发布时间】:2019-11-18 03:50:29
【问题描述】:

我正在尝试摆脱 laravel_session。

我已经尝试为它创建一个中间件

https://laracasts.com/discuss/channels/laravel/laravel-51-disable-session-and-cookies-for-some-routes

更改要使用的驱动程序:array file, database

这些都不起作用。每次刷新,我总是看到这个:

我怎样才能做到这一点?有可能吗?

【问题讨论】:

  • 这是浏览器发送的cookie,测试新设置时清除它(清除浏览器缓存/历史记录)

标签: php laravel laravel-5


【解决方案1】:

如果您根本不想启动会话,请在 Laravel 5.1 中转到 app/Http/Kernel.php 并注释掉与会话相关的部分:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    // \Illuminate\Session\Middleware\StartSession::class,
    // \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    // \App\Http\Middleware\VerifyCsrfToken::class,
];

请注意,仅删除 StartSession 中间件是不够的,您还必须禁用 ShareErrorsFromSessionVerifyCsrfToken,因为它们依赖于存在的会话。如果您想要更多逻辑,例如为某些路由排除它,您可以覆盖 StartSession middelware。我不知道有任何其他副作用,因为我还没有测试过。

如果您不需要会话或所有与网站相关的功能,例如,您只是构建一个 API,您可能需要查看为此目的而简化的 Laravel Lumen

顺便说一句:会话驱动程序只定义了在哪里/如何存储会话服务器端。从客户端来看,它仍然只是一个加密的 cookie。

【讨论】:

  • 我一注释掉这 3 行,就收到了这个错误Session store not set on request. - 你有什么建议吗?
  • @ihue 不太清楚为什么会这样,我自己也试过了,到目前为止似乎还有效。确保您已正确清理所有内容,也许您甚至可以尝试重新启动您的网络服务器。您还可以尝试将会话驱动程序设置为array,以确保至少有一些功能(如果需要它)并且在请求后它会被清除。该错误究竟发生在哪里?根据会话确保视图中没有任何内容(例如检查 $errors 或呈现 CSRF 令牌)。
【解决方案2】:

如果我有不希望 Laravel 使用 laravel_session 的特定路线。 您可以将其应用于您想要的任何路线。

例如。例如,如果您只想申请这 2 条路线:

url1url2

Route::get('/url1', 'SampleController@fnName');

Route::get('/url2', 'SampleController@fnName2');


创建/app/Http/Middleware/StartSessionMiddleware.php

<?php
namespace App\Http\Middleware;

use Closure;
use Config;

use Illuminate\Session\Middleware\StartSession as BaseStartSession;

class StartSessionMiddleware extends BaseStartSession
{

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next) {

        if($request->is('url1') || $request->is('url2')) {
            Config::set('session.driver', 'array');
        }

        return parent::handle($request, $next);
    }
}

通过在 /app/Http/Kernel.php 中添加一行来注册它

\App\Http\Middleware\StartSessionMiddleware::class,

现在,这两条路线的 laravel_session 应该不再存在了。

我希望这可以帮助某人。

【讨论】:

    【解决方案3】:

    对于任何搜索的人,在 Laravel 5.5+ 中,您可以更改环境变量 SESSION_COOKIE=。如果你有一个更旧的应用程序,你可能需要直接在config/session.php 中设置它。

    【讨论】:

      【解决方案4】:

      使用

      if($request->path('url1') || $request->path('url2')) {
      

      查找 url 路径。对于我使用的欧盟 Cookie 跟踪:

      <?php
        namespace App\Http\Middleware;
      
        use Closure;
        use Config;
      
        use Illuminate\Session\Middleware\StartSession as BaseStartSession;
      
        class StartSessionMiddleware extends BaseStartSession
        {
      
      /**
       * Handle an incoming request.
       *
       * @param  \Illuminate\Http\Request  $request
       * @param  \Closure  $next
       * @return mixed
       */
      public function handle($request, Closure $next) {
      
          if(!isset($_COOKIE['my-cookie'])) {
              Config::set('session.driver', 'array');
          }
      
          return parent::handle($request, $next);
        }
      }
      

      当用户接受时,使用 my-cookie 作为您设置的 cookie 的名称。

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 2021-12-08
        • 1970-01-01
        • 2021-08-14
        • 2012-06-18
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多