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

导航离开并使用后退按钮后,Laravel 5闪烁信息再次闪烁,laravel,Laravel,在我的控制器里,我正试图用一条快闪信息重定向回laravel 5。这一切都很好。问题是,无论我如何设置,如果我离开,然后使用浏览器的“后退按钮”返回,flash消息总是会重新出现 所以我有一个用户列表,每个用户旁边都有一个删除按钮。当我单击delete按钮时,它调用我的控制器方法进行销毁。我在那里做了一个小条件,如果我试图删除一个所有者,它会带着一个错误重定向回来。我尝试了以下不同的方法重定向回浏览器,但最终还是遇到了同样的问题,在导航离开并通过浏览器的“返回按钮”返回后,消息再次显示 一, 二

在我的控制器里,我正试图用一条快闪信息重定向回laravel 5。这一切都很好。问题是,无论我如何设置,如果我离开,然后使用浏览器的“后退按钮”返回,flash消息总是会重新出现

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

一,

二,

在我看来,我是这样选择的:

@if (Session::has('error_message'))
     {{ Session::get('error_message') }}
@endif
这很好,我明白了。但是,例如,当我单击我的用户列表中的某个用户进入详细信息页面并按下浏览器的“后退按钮”时,消息再次闪烁。我不明白为什么它一直在闪烁这些数据,我的印象是它只闪烁一次

即使我尝试在显示后立即清除它(如下图所示),也没关系,它总是会重新出现吗

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

通常,当用户单击浏览器中的“上一页”按钮时,浏览器会尝试显示上一页的内容,而无需重新加载。因此,它可能不会再次向会话闪烁,而是浏览器试图通过为您缓存页面来帮助您。

看起来确实是浏览器缓存,在添加停止缓存的代码后,它是正常的,消息消失了。我仍然觉得奇怪,我必须将此代码添加到控制器以阻止其缓存:

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>

标头设置缓存控制“无缓存,无存储,必须重新验证”
标题集Pragma“无缓存”
标题集过期0

但这对我来说似乎有点过分;)

我刚刚遇到了这个问题,我认为解决这个问题的唯一方法是使用AJAX将flash消息加载到页面中


我还没有对此进行测试,但我假设当用户返回并且AJAX请求触发时,之前的flash消息已经被清除。

您可以使用javascript显示flash消息,并使用
会话存储来停止重复消息。浏览器缓存不知道浏览器是否已经显示了一条消息,但我们可以使用
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');
}

...
var popupId=“{{uniqid()}}”;
if(会话存储){
//防止显示是否存在于存储器中(如图所示);
如果(!sessionStorage.getItem('显示-'+popupId)){
$('#flash container').append({session('status')});
}
setItem('show-'+popupId,'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

步骤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'); 
}

很好:)

你能提供任何支持这一点的文档吗?但为什么一条闪光消息会像这样一遍遍地出现呢。还有,我怎样才能阻止它这样做?我的意思是,这是一个非常常见的事情,通过后退按钮在页面上卷回,所以我不能想象,没有其他人有问题的Flash消息再次显示。是一个快速搜索,我发现,支持这个想法,我可以尝试停止缓存,并走这条路线(thx的链接顺便说一句),但在我看来,一切在拉威尔它是如此完美,这必须是其他东西,然后缓存。这意味着每个使用Flash消息的站点都必须尝试停止所有缓存,这听起来很不对。这是一个不正确的答案,我有同样的问题,我需要解决方案,而不是解释后退按钮的工作原理。你测试过这段代码吗?请告诉我这是否有效?是的,我测试过。效果很好
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'); 
    } 
}
public function __construct() 
{ 
    $this->middleware('preventBackHistory');
    $this->middleware('auth'); 
}