在我的控制器中,我尝试使用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') !!}
答案 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>
但这对我来说似乎有点矫枉过正;)