我完全不知道这件事。我使用的是Laravel 5.1.26。我有一个索引页面,可以在访问时清除会话数据:
Route::get('/', function (Illuminate\Http\Request $request) {
$request->session()->flush();
return view('index');
});
在此视图中,我打印出会话数据以确认已使用以下行清除:
<pre>
<?php print_r(Session::all()); ?>
输出通过显示Array()
确认会话已清除。
我有第二个加载视图的路由,然后对第三个URL进行Ajax调用:
这是第二条路线和视图:
路线
Route::get('tweeting', function(Illuminate\Http\Request $request) {
return view('tweeting');
});
查看
<pre>
<?php print_r(Session::all()); ?>
@unless (Session::get('tweets_posted'))
<script>
$(document).ready(function() {
$.ajax({
url: '/tweet',
dataType: 'json',
type: 'POST',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
}
}).done(function() {
$('.done').show();
}).fail(function() {
$('.error').show();
}).always(function() {
$('.spinner').hide();
});
});
</script>
@endunless
如您所见,此视图再次打印出会话内容并向另一个路径发出ajax POST请求。那条路线在这里:
Route::post('tweet', function(Illuminate\Http\Request $request) {
$request->session()->put('tweets_posted', true);
return response()->json([]);
});
如果用户重新加载/tweeting
页面,我试图阻止再次发出ajax调用,但如果他们首先返回索引页面则再次允许调用,因此调用{ {1}}第一条路线上的会话。
但是,我发现在会话中设置flush()
值之后,即使在返回索引页面后它也不会清除。以下是我采取的步骤:
是否有人能够复制或解释为什么会发生这种情况?
如果相关,我会使用默认会话驱动程序。
更新
甚至更奇怪的是,只要我删除了在第三条路线中设置tweets_posted
会话数据的呼叫。问题消失了。意思是,在完成上述步骤后重复问题几次,如果我将第三条路线更改为:
tweets_posted
然后访问Route::post('tweet', function(Illuminate\Http\Request $request) {
return response()->json([]);
});
路由,然后访问/
路由,会话数据已正确清除。