2015-05-04 32 views
5

在我的控制器中,我嘗試使用laravel 5中的Flash消息重定向。這一切都很好。問題是無論我如何設置閃光燈消息總是會重新出現,如果我導航,然後通過使用瀏覽器的後退按鈕回來。Laravel 5閃光燈消息在導航和使用後退按鈕後再次閃爍

所以我有一個用戶列表與每個用戶旁邊的刪除按鈕。當我點擊刪除按鈕時,它會調用我的控制器方法來銷燬。我在那裏做了一個有條件的重定向,如果我想刪除一個所有者。我嘗試了以下不同的方式來重定向回來,但是所有結束後我都會遇到同樣的問題,即消息在導航後通過瀏覽器的後退按鈕返回時再次顯示。

return Redirect::route('users')->with('error_message', 'Some error msg'); 
Session::flash('error_message', 'Some error msg'); 
return Redirect::to('users'); 

在我看來,我把它撿起來是這樣的:

@if (Session::has('error_message')) 
    {{ Session::get('error_message') }} 
@endif 

使作品很好,我得到的消息。但只要我點擊我的用戶列表中的用戶以轉到詳細信息頁面,然後按瀏覽器的「後退按鈕」,該消息就會再次閃爍。我不明白爲什麼它會一直閃爍着這些數據,我的印象是它只閃爍一次。

即使我試圖在顯示後立即清除它(如下圖),它並不重要,它會一直重新出現?

{!! Session::forget('error_message') !!} 

回答

1

一般來說,當用戶點擊瀏覽器的後退按鈕時,瀏覽器嘗試無需重新加載它來顯示前一頁的內容。所以Laravel可能不會再次閃爍到會話中,但瀏覽器試圖通過爲您緩存頁面來幫助您。

+0

你能提供任何文檔支持嗎? –

+0

但是爲什麼一個flash消息會像這樣一遍又一遍地出現。更多我怎麼能阻止它這樣做?我的意思是,通過後退按鈕回到頁面上是一件很常見的事情,所以我無法想象沒有人再次出現Flash消息的問題。 – Ahzrael

+0

[this](http://blog.55minutes.com/2011/10/how-to-defeat-the-browser-back-button-cache/)是一個快速搜索,我發現它支持這個想法 –

0

好吧,它似乎確實是瀏覽器緩存,並添加代碼停止緩存後,它是好的,消息消失。它仍然是怪我,我不得不將此代碼添加到控制器從高速緩存停止:

header('Cache-Control: no-store, private, no-cache, must-revalidate'); header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false); 
header('Pragma: public'); 
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); 
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT'); 
header ('Pragma: no-cache'); 

還是這在htaccess的:

<IfModule mod_headers.c> 
    Header set Cache-Control "no-cache, no-store, must-revalidate" 
    Header set Pragma "no-cache" 
    Header set Expires 0 
</IfModule> 

但似乎有點矯枉過正我;)

1

我剛剛遇到了這個問題,我認爲唯一的解決方法是AJAX將你的Flash消息加載到頁面中。

我還沒有測試過,但我認爲當用戶返回並且AJAX請求觸發時,之前的Flash消息已經被清除。

1

您可以使用JavaScript顯示Flash消息並使用SessionStorage停止重複消息。瀏覽器緩存不知道瀏覽器是否已顯示消息,但我們可以使用SessionStorage在顯示之前對其進行檢查。

<div id="flash-container"></div> 
... 

var popupId = "{{ uniqid() }}"; 

if(sessionStorage) { 
    // prevent from showing if it exists in a storage (shown); 
    if(!sessionStorage.getItem('shown-' + popupId)) { 
     $('#flash-container').append("<div>{{ session('status') }}</div>"); 
    } 
    sessionStorage.setItem('shown-' + popupId, '1'); 
} 
+0

您測試了嗎?這個代碼,請告訴我,如果這工作或沒有? – msbomrel

+0

是的,我做到了。很好的工作 –

+0

是的,它對我來說也很有用,非常感謝。 – msbomrel

1

對於那些你不關心後退按鈕:

@if (Session::has('error_message')) 
{{ Session::get('error_message') }} 
{{ Session::forget('error_message') }} 
@endif 

,如果那不說清楚了,試試:

@if (Session::has('error_message')) 
{{ Session::get('error_message') }} 
{{ Session::forget('error_message') }} 
{{ Session::save() }} 
@endif 
0

第1步:創建一箇中間件使用以下命令:

php artisan make:middleware PreventBackHistory

步驟2:

與以下內容替換PreventBackHistory.php的內容:

命名空間應用\ HTTP \中間件;

使用關閉;

class PreventBackHistory {/ ** *處理傳入的請求。 * * @param \ Illuminate \ Http \ Request $ request * @param \ Closure $ next * @return mixed */public function handle($ request,Closure $ next){$ response = $ next($ request);返回$ response-> header('Cache-Control','no-cache,no-store,max-age = 0,must-revalidate') - > header('Pragma','no-cache') - > header ('Expires','Sun,02 Jan 1990 00:00:00 GMT'); }}

步驟3:在kernal.php寄存器中間件

'preventBackHistory'=> \應用\ HTTP \中間件\ PreventBackHistory ::類,

步驟4:在控制器中的construstor

使用中間件

public function __construct() {$ this-> middleware('preventBackHistory'); $這 - >中間件( 'AUTH'); }

而且好去:)