2017-04-07 58 views
0

我的问题如下:以只读模式启动会话

我有一个运行一系列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的会话存储。

+0

你确定你没有修改自己的变量?每个请求都应该阻止会话,所以我不会看到一个请求可以保持打开状态,而另一个请求会同时修改会话。您当然可以打开您的会话,复制数组并立即关闭会话,然后在每个脚本的顶部不需要修改它。 – jeroen

+0

您可以等待下一个ajax的调用,直到当前的ajax请求完成。而在阿贾克斯你可以关闭会话,并与'session_write_close()'(在PHP) – Oliver

+0

保存@jeroen我指的是laravel会话。我不确定在请求终止之前是否可以关闭laravel会话。更新澄清。 – apokryfos

回答

0

在情况下,它可以帮助任何人,这是我落得这样做:

在我RouteServiceProvider.phpboot()方法:

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

这此启动会话,但是当请求终止不保存它。其他一切行为相同。