【问题标题】:Laravel Form::open() giving expired _token?Laravel Form::open() 提供过期的_token?
【发布时间】:2015-05-16 07:11:59
【问题描述】:

这个问题今天早上才开始发生,我不知道是什么导致了它。我在网站的顶部导航中实施了一个小型搜索表单,截至上周它运行良好。今天早上,它为每次提交返回“TokenMismatchException”。

通过我的调试器,我可以在 csrf 过滤器中看到 Input::get('_token') 的值确实与 Session::token() 的值不同。我还可以查看生成的表单的 HTML 源代码并比较自动生成的隐藏 _token 字段的值,看看它与会话存储中的令牌不同(使用 4.2 的本机文件存储,因此这些文件就在我的 IDE)。

看起来,无论出于何种原因,生成的_token 的值始终等于last 会话中令牌的值。换句话说,Form::open() 给了我一个在一个会话前过期的令牌。或者在Form::open() 输出令牌之后 正在创建一个新会话。

我已经盯着它看了整整 2.5 个小时,无法理解是什么原因造成的。有什么想法吗?

编辑:添加代码 -

查看:

{{ Form::open(['route' => 'search.customer_job', 'id' => 'customer-job-search-form']) }}
... // a single select field
{{ Form::close() }}

路线:

Route::post('search/customerJobCombined', ['before' => ['csrf', 'auth'], 'as' => 'search.customer_job', 'uses' => 'SearchController@customerJobSearch']);

它实际上从来没有到达控制器,所以我将把它排除在外以避免墙壁文字。只有一个变量被传递给视图——它填充了选择选项——这是通过视图编辑器完成的——这里是:

public function compose($view)
{
    $result = $this->command_bus->execute(new GenerateCustomerJobQuickSearchOptionsCommand());
    $view->with('customer_job_quick_search_options', $result->options);
}

不过,所有这些都运行良好。

编辑#2: 这是一个非常愚蠢的错误,涉及一些调试代码 (Session::flush()),我几天前添加并在度假时忘记了。

【问题讨论】:

  • 你在什么类型的服务器上?您是否尝试更改会话驱动程序?
  • 目前这一切都发生在 Homestead 上,所以 Ubuntu 14.04 / GNU / Linux。我没有更改会话驱动程序,但我最近确实更新了我的 vagrant box。我会尝试更改驱动程序,看看是否有帮助......理想情况下,我不需要为此更改驱动程序。
  • 更改会话驱动程序(到 redis)没有帮助
  • 是否有任何中间件可以重新生成会话?
  • 在 laravel 4.2 中没有什么是开箱即用的。我没有添加任何中间件。

标签: php forms session laravel csrf


【解决方案1】:

这是一个涉及旧调试代码的错误。

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 2014-04-15
    • 2019-02-28
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    相关资源
    最近更新 更多