以只读模式启动会话
问题描述:
我的问题如下:以只读模式启动会话
我有一个运行一系列AJAX调用的页面,例如,
$.ajax({ url: "/user/post1" });
$.ajax({ url: "/user/post2" });
$.ajax({ url: "/user/post3" });
...
$.ajax({ url: "/user/postN" });
(我已经事先确定的ID)
我也得到了:
$.ajax({ url: "/user/modifysessiondata" });
现在的问题是,我需要开始在每个会话和每个请求(以获得当前用户)以及“/ user/modifysessiondata”还需要修改会话数据。
但是我发现,如果我只是在一次有可能执行所有的AJAX请求,如果/user/postX
请求之前/user/modifysessiondata
请求开始,之后结束,然后它会保存会话数据,因为它是当请求被称为和因此会覆盖第二个呼叫设置的会话数据。
我的问题是:
是否有可能标志会议提出具体要求开始为“只读”?我需要为此创建一个新的定制StartSession
中间件吗?
我只是在做一件完全荒谬的事情吗?
注意:为了澄清我在谈论Laravel会议。我正在使用支持redis的会话存储。
答
在情况下,它可以帮助任何人,这是我落得这样做:
在我RouteServiceProvider.php
boot()
方法:
Route::group([
'middleware' => 'readonly',
'namespace' => $this->namespace,
], function ($router) {
Route::get("user/{post}","[email protected]");
});
在我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 */ }
}
这此启动会话,但是当请求终止不保存它。其他一切行为相同。
你确定你没有修改自己的变量?每个请求都应该阻止会话,所以我不会看到一个请求可以保持打开状态,而另一个请求会同时修改会话。您当然可以打开您的会话,复制数组并立即关闭会话,然后在每个脚本的顶部不需要修改它。 – jeroen
您可以等待下一个ajax的调用,直到当前的ajax请求完成。而在阿贾克斯你可以关闭会话,并与'session_write_close()'(在PHP) – Oliver
保存@jeroen我指的是laravel会话。我不确定在请求终止之前是否可以关闭laravel会话。更新澄清。 – apokryfos