在 read-only 模式下启动 session

Start a session in read-only mode

我的问题如下:

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

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

(我事先确定了id)

我还有:

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

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

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

我的问题是:

是否可以将在特定请求中启动的 session 标记为 "Read only"?我需要为此创建一个新的自定义 StartSession 中间件吗?

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

注:澄清一下,我说的是 Laravel session。我正在使用 redis 支持的 session 存储。

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

在我的RouteServiceProvider.phpboot()方法中:

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 */ }
}

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

更新:

正如@woens 指出的那样,不再使用 terminate 函数,而是使用 saveSession,因此 Laravel 5.8+ 用户的新代码将是:

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