Laravel会话数据和Ajax请求的奇怪行为

时间:2015-12-08 03:38:35

标签: php laravel session

我完全不知道这件事。我使用的是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()值之后,即使在返回索引页面后它也不会清除。以下是我采取的步骤:

  1. 访问&#39; /&#39;,确认会话为空
  2. 访问&#39; / tweeting&#39;,确认ajax调用
  3. 访问&#39; /&#39;,确认会话为空
  4. 访问&#39; / tweeting&#39;,并注意该会话仍包含&quot; tweets_posted&#39; = true,因此没有进行Ajax调用。
  5. 是否有人能够复制或解释为什么会发生这种情况?

    如果相关,我会使用默认会话驱动程序。

    更新

    甚至更奇怪的是,只要我删除了在第三条路线中设置tweets_posted会话数据的呼叫。问题消失了。意思是,在完成上述步骤后重复问题几次,如果我将第三条路线更改为:

    tweets_posted

    然后访问Route::post('tweet', function(Illuminate\Http\Request $request) { return response()->json([]); }); 路由,然后访问/路由,会话数据已正确清除。

0 个答案:

没有答案