Php 阻止Laravel中路由的会话(自定义按需会话处理)

Php 阻止Laravel中路由的会话(自定义按需会话处理),php,session,laravel,laravel-4,laravel-routing,Php,Session,Laravel,Laravel 4,Laravel Routing,我正在使用laravel和设置为REDIS的默认会话驱动程序为我的Android应用程序构建API 我在这里找到了一篇很好的文章,这篇文章有一定的作用 然而,当我点击url时,它也会点击redis并生成一个空键。现在,我希望避免在redis中创建空会话密钥。理想情况下它不应该撞到redis我怎么能做到 我们是否可以定制Session,以便只为特定路由生成会话(或禁用特定路由) 我可以用具体的用例解释更多,请让我知道。似乎有一种方法可以使用会话拒绝回调来实现这一点 相关消息来源 我在网上找

我正在使用laravel和设置为REDIS的默认会话驱动程序为我的Android应用程序构建API

我在这里找到了一篇很好的文章,这篇文章有一定的作用

然而,当我点击url时,它也会点击redis并生成一个空键。现在,我希望避免在redis中创建空会话密钥。理想情况下它不应该撞到redis我怎么能做到

我们是否可以定制Session,以便只为特定路由生成会话(或禁用特定路由)


我可以用具体的用例解释更多,请让我知道。

似乎有一种方法可以使用会话拒绝回调来实现这一点

相关消息来源

我在网上找不到太多关于这个的引用,但是通过阅读源代码可以发现,如果session reject回调返回一个truthy值,那么会话将被迫使用数组驱动程序来处理请求,而不是使用任何配置的驱动程序。您的回调还将注入当前请求,以便您可以根据请求参数执行一些逻辑

我只在本地安装的Laravel4.2上测试过这个,但它似乎可以工作。您只需要将函数绑定到session.reject

首先,创建SessionRejectServiceProvider(或类似的东西)


我一直在尝试实现类似的功能

我们的API是无状态的,除了1个路由-版本1购物车

最后,我在app/config/session.php中设置了
'driver'
,如下所示

'driver' => 'v1/cart' === Request::getDecodedPath() ? 'native' : 'array',
没什么神奇的。最初我们考虑使用before过滤器,但这还不够早

这似乎是一种简单的做事方式,但我可能遗漏了一些东西

对于其他开发人员来说,将开关放在配置中似乎是一个容易看到驱动程序是什么的地方,而将其放在服务提供程序中则是一个非常隐蔽的地方,在不知道安装了什么服务提供程序以及它们与什么交互的情况下,调试会困难得多

无论如何。希望这是有用的

正如下文所指出的。。。如果配置是动态的,请不要缓存它


这确实导致它的用途有限。一旦我们不再需要支持v1/cart,我们将放弃此路由,然后重新使用静态配置。

使用Laravel 5中的中间件非常容易,我需要任何带有API密钥的请求来避免会话,我只是做了:


实现这一点的最简单方法是创建自己的AppStartSession中间件,该中间件的子类为Lightning\Session\middleware\StartSession,并替换kernel.php中使用的类。您需要在子类中重写的唯一方法是sessionConfigured(),对于该方法,您可以返回false以禁用会话,或者返回parent::sessionConfigured()以允许它

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Session\Middleware\StartSession;

class AppStartSession extends StartSession
{
    protected function sessionConfigured(){
        if(!\Request::has('api_key')){
            return false;
        }else{
            return parent::sessionConfigured();
        }
    }
}

在Laravel 5中,不要使用
开始会话
会话中的共享错误
,以及
验证CSRFToken
中间件

在我的应用程序中,我将这三个中间件从
web
组移动到一个新的
stateful
组,然后我将这个
stateful
组包括在需要了解会话的路由上(在所有情况下,除了
web
,至少在我的应用程序中)。其他路线属于
web
api


现在,当向未使用
有状态
中间件组会话cookie的路由发出请求时,不会发回会话cookie。

自从引入了Laravel 5.2中间件组后,您可以通过在“web”中间件组之外定义某些路由来禁用会话(包括负责会话处理的StartSession中间件)。在最新的5.2.x版本中,整个default routes.php文件都用“web”包装中间件组,您需要在
app/Providers/RouteServiceProvider.php
文件中进行一些修改,如前所述。

Laravel default有两个路由组,分别称为
web
api
,api路由组默认不带会话

因此,我们可以将任何路由角色写入
routes/api.php
,而不使用会话默认值

如果不想使用api前缀url,我们可以修改
app\Providers\RouteServiceProvider
添加如下新组:

Route::中间件('api')
->名称空间($this->namespace)
->组(基本路径('routes/static.php');
现在,您可以将任何路由放入
routes/static.php
文件中,以避免使用会话


希望对您有所帮助。

Laravel 5x

在App\Providers\RouteServiceProvider文件中,只需将mapApiRoutes()方法复制到名为mapStaticRoutes()的新方法中,删除前缀('api')调用,并添加“routes/static.php”(您需要创建此文件)。这将使用相同的无状态“api”中间件,并且没有为路由分配/api前缀

protected function mapStaticRoutes()
{
    Route::middleware('api')
         ->namespace($this->namespace)
         ->group(base_path('routes/static.php'));
}
只需更新“map()”方法以调用“$this->mapStaticRoutes();”,这样它就可以知道您的新文件了。而且,在那里添加的任何路由现在都应该是无状态的,而且不需要做太多工作

public function map()
{
    $this->mapApiRoutes();

    $this->mapWebRoutes();

    // Static Routes (stateless, no /api prefix)
    $this->mapStaticRoutes();
}
static.php

// Health Check / Status Route (No Auth)
Route::get('/status', function() {
    return response()->json([
        'app'       => 'My Awesome App',
        'status'    => 'OK'
    ]);
});

添加
\Config::set('cookie.driver',array');
也可以防止应用程序在响应中发送cookie。你说app.conf应为Config/app.php是什么意思?如果缓存配置,这将失败,这不是一个理想的情况。从[这些]Larvel“开发人员”的角度来看,这一点有点令人担忧我们没有看到框架中的模块化潜力,而是选择编写一些骇人的解决方案。其他答案完全是胡说八道。这可能是最好的答案,只需将不需要会话的路由转移到他们自己的中间件组中即可。我觉得这是Taylor建议的方式。
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,

       // *** Replace start session class
       // \Illuminate\Session\Middleware\StartSession::class,
        \App\Http\Middleware\AppStartSession::class,

        // *** Also comment these ones that depend on there always being a session.
        //\Illuminate\View\Middleware\ShareErrorsFromSession::class,
        //\App\Http\Middleware\VerifyCsrfToken::class,
    ];

    /**
     * The application's route middleware.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    ];
}
protected function mapStaticRoutes()
{
    Route::middleware('api')
         ->namespace($this->namespace)
         ->group(base_path('routes/static.php'));
}
public function map()
{
    $this->mapApiRoutes();

    $this->mapWebRoutes();

    // Static Routes (stateless, no /api prefix)
    $this->mapStaticRoutes();
}
// Health Check / Status Route (No Auth)
Route::get('/status', function() {
    return response()->json([
        'app'       => 'My Awesome App',
        'status'    => 'OK'
    ]);
});