导航离开并使用后退按钮后,Laravel 5闪光信息再次闪烁

时间:2015-05-04 20:02:51

标签: laravel

在我的控制器中,我尝试使用laravel 5中的Flash消息重定向。这一切都很有效。问题是无论我如何设置它,如果我离开然后通过使用浏览器的后退按钮返回,闪存消息总是会重新出现。

所以我有一个用户列表,每个用户旁边都有一个删除按钮。当我单击删除按钮时,它调用我的控制器方法来销毁。我在那里做了一个有条件的条件,如果我想删除一个所有者,重定向返回错误。我尝试了以下不同的方式重定向回来,但是我最后解决了导航离开并通过浏览器的“后退按钮”返回后再次显示消息的问题。

1

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

2

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') !!}

6 个答案:

答案 0 :(得分:2)

通常,当用户单击浏览器中的后退按钮时,浏览器会尝试显示上一页的内容而不重新加载。所以Laravel可能不会再次闪回会议,但是浏览器试图通过为您缓存页面来帮助您。

答案 1 :(得分:2)

对于那些不关心后退按钮的人:

@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

答案 2 :(得分:1)

我刚遇到这个问题,我认为解决这个问题的唯一方法就是将AJAX加载到页面中。

我还没有对此进行测试,但我认为当用户返回并且AJAX请求触发时,之前的Flash消息将被清除。

答案 3 :(得分: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');
}

答案 4 :(得分:1)

步骤1:使用以下命令创建一个中间件:

php artisan make:middleware PreventBackHistory

第2步:

将PreventBackHistory.php的内容替换为以下内容:

namespace App\Http\Middleware;

use Closure;

class PreventBackHistory { 

    /*  Handle an incoming request. 
     *  @param \Illuminate\Http\Request $request
     *  @param \Closure $next 
     *  @return mixed 
     */ 
    public function handle($request, Closure $next) 
    { 
        $response = $next($request);
        return $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' => \App\Http\Middleware\PreventBackHistory::class,

第4步:在控制器的委托人中使用中间件

public function __construct() 
{ 
    $this->middleware('preventBackHistory');
    $this->middleware('auth'); 
}

很高兴去:)

答案 5 :(得分: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>

但这对我来说似乎有点矫枉过正;)