2017-04-07 37 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 */ } 
} 

這此啓動會話,但是當請求終止不保存它。其他一切行爲相同。