以只读模式启动会话

时间:2017-04-07 13:16:12

标签: php laravel laravel-5.3

我的问题如下:

我有一个运行一系列AJAX调用的页面,例如

$.ajax({ url: "/user/post1" });
$.ajax({ url: "/user/post2" });
$.ajax({ url: "/user/post3" });
...
$.ajax({ url: "/user/postN" }); 

(我事先确定了ids)

我也有:

$.ajax({ url: "/user/modifysessiondata" }); 

现在的问题是我需要在每个请求中启动会话(以获取当前用户),此外“/ user / modifysessiondata”还需要修改会话数据。

但是我注意到,如果我只是立即执行所有AJAX请求,那么/user/postX请求可能会在/user/modifysessiondata请求之前开始并在此之后结束,那么它会将会话数据保存为是在调用请求时,因此将覆盖第二次调用设置的会话数据。

我的问题是:

是否可以将在特定请求中启动的会话标记为“只读”?我是否需要为此创建一个新的自定义StartSession中间件?

我只是在做一些完全荒谬的事情吗?

注意:澄清我在谈论Laravel会话。我正在使用redis支持的会话存储。

1 个答案:

答案 0 :(得分:0)

如果它对任何人有帮助,这就是我最终做的事情:

在我的RouteServiceProvider.php boot()方法中:

Route::group([
    'middleware' => 'readonly',
    'namespace' => $this->namespace,
], function ($router) {
    Route::get("user/{post}","UserController@getPost");
});

在我的Kernel.php

'readonly' => [            
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \App\Http\Middleware\StartReadOnlySession::class,            
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,   
        'bindings',
 ]

这基本上是从web路线组中复制的,StartSession替换为StartReadOnlySession

除外

这是我的StartReadOnlySession代码(问题的妙语):

use Illuminate\Session\Middleware\StartSession;
class StartReadOnlySession extends StartSession {
    public function terminate($request, $response) { /* Does nothing */ }
}

这会启动会话,但在请求终止时不会保存。其他一切行为都相同。