在 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.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 */ }
}
这会启动会话,但不会在请求终止时保存它。其他所有行为都相同。
更新:
正如@woens 指出的那样,不再使用 terminate
函数,而是使用 saveSession
,因此 Laravel 5.8+ 用户的新代码将是:
use Illuminate\Session\Middleware\StartSession;
class StartReadOnlySession extends StartSession {
public function saveSession($request, $response) { /* Does nothing */ }
}
我的问题如下:
我有一个运行一系列 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.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 */ }
}
这会启动会话,但不会在请求终止时保存它。其他所有行为都相同。
更新:
正如@woens 指出的那样,不再使用 terminate
函数,而是使用 saveSession
,因此 Laravel 5.8+ 用户的新代码将是:
use Illuminate\Session\Middleware\StartSession;
class StartReadOnlySession extends StartSession {
public function saveSession($request, $response) { /* Does nothing */ }
}