【发布时间】: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