在routes / web.php中引起的Laravel TokenMismatchException

时间:2017-07-05 12:12:59

标签: php laravel csrf

我正在Routing中通过查看由Laravel 5.4创建的教程来学习DevDojo。使用routes/web.php中的以下代码会出现TokenMismatchException错误,按下提交按钮后我的代码无效:

Route::post('test', function () {
    return 'Printed by the route responsible for test post action.';
});

Route::get('test', function () {
    echo '<form method="post" action="test">';
    echo '<input type="submit">';
    echo '</form>';
});

我在这里搜索了同一个论坛以及网络上的其他地方,例如laravel.iolaracasts.com,每个人都在谈论当Laravel尝试检测session时发生的问题。请求即将完成。
我尝试通过在Route::get规则中添加以下行来解决问题,但问题没有得到解决:

echo '<input type="hidden" name="_method" value="post">';
echo '<input type="hidden" name="_token" value="csrf_field();">';

我希望您通过告诉我如何在路径文件中正确使用csrf_field()csrf_token()或其他所需内容来帮助我解决问题。

非常感谢你提前。

2 个答案:

答案 0 :(得分:3)

csrf_token()只是为您提供令牌。

csrf_field()为您构建整个输入字段。

示例:

{{ csrf_token() }} //输出:SomeRandomString

{{ csrf_field() }} //输出:<input type="hidden" name="_token" value="SomeRandomString">

你问题中的

: 使用

<input type="hidden" name="_token" value="csrf_token();">;

而不是

<input type="hidden" name="_token" value="csrf_field();">;
另一方面

你可以使用

echo csrf_field();

OR

{{ csrf_field() }} 

答案 1 :(得分:1)

我认为你在隐藏输入的正确轨道上(如果你有一个新的Laravel安装,否则确保没有禁用检查令牌);

我建议您使用Laravel的(官方)表单生成器来处理表单(have a look here)。

之后,看看here

(1) {{ Form::open(array('url' => 'profile')) }} 你的表格在这里 {{ Form::close() }}

(2)确保输出令牌:echo Form::token();(在关闭表单之前)

(3)最后,注册一个POST路由,检查令牌:

Route::post('profile', array('before' => 'csrf', function() { // }));

或者,您可以直接指定表单操作(我个人最喜欢的):

echo Form::open(array('action' => 'Controller@method'))