我安装了Laravel 5.7
已将表单添加到文件<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
\routes\web.php
已添加到文件Route::post('/foo', function () {
echo 1;
return;
});
5.6
发送POST请求后:
419对不起,您的会话已过期。请刷新,然后重试。
在using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace StopwatchTimer
{
public partial class Form1 : Form
{
private static readonly Stopwatch watch = new Stopwatch();
private long diff = 0, previousTicks = 0, ticksDisplayed = 0;
public Form1()
{
InitializeComponent();
richTextBox1.TabStop = false;
richTextBox1.ReadOnly = true;
richTextBox1.BackColor = Color.White;
richTextBox1.Cursor = Cursors.Arrow;
richTextBox1.Enter += RichTextBox1_Enter; ;
UpdateTime();
}
private void RichTextBox1_Enter(object sender, EventArgs e)
{
btnStart.Focus();
}
private void UpdateTime()
{
richTextBox1.Text = GetTimeString(watch.Elapsed);
}
private string GetTimeString(TimeSpan elapsed)
{
string result = string.Empty;
//calculate difference in ticks
diff = elapsed.Ticks - previousTicks;
if (radioButton1.Checked == true)
{ //counting up
ticksDisplayed += diff;
}
else
{ //counting down
ticksDisplayed -= diff;
}
if (ticksDisplayed < 0)
{
ticksDisplayed = 0;
}
//Make ticksDisplayed to regular time to display in richtextbox
TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
result = string.Format("{0:00}:{1:00}:{2:00}.{3:000}",
ctimeSpan.Hours,
ctimeSpan.Minutes,
ctimeSpan.Seconds,
ctimeSpan.Milliseconds);
previousTicks = elapsed.Ticks;
return result;
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void btnStart_Click(object sender, EventArgs e)
{
if (btnStart.Text == "START")
{
watch.Reset();
watch.Start();
UpdateTime();
btnStart.Text = "STOP";
timer1.Enabled = true;
}
else
{
watch.Stop();
btnStart.Text = "START";
btnPause.Text = "PAUSE";
timer1.Enabled = false;
}
}
private void btnReset_Click(object sender, EventArgs e)
{
watch.Reset();
TimeSpan ctimeSpan = new TimeSpan(0, trackBarHours.Value, trackBarMinutes.Value, trackBarSeconds.Value, 0);
diff = 0;
previousTicks = 0;
ticksDisplayed = ctimeSpan.Ticks;
trackBarHours.Value = 0;
trackBarMinutes.Value = 0;
trackBarSeconds.Value = 0;
richTextBox1.Text = "00:00:00.000";
}
private void trackBarHours_Scroll(object sender, EventArgs e)
{
//get ticksDisplayed as TimeSpan
TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
//change only the hour
TimeSpan htimeSpan = new TimeSpan(ctimeSpan.Days, trackBarHours.Value, ctimeSpan.Minutes, ctimeSpan.Seconds, ctimeSpan.Milliseconds);
//set it to ticksDisplayed and update.
ticksDisplayed = htimeSpan.Ticks;
UpdateTime();
}
private void trackBarMinutes_Scroll(object sender, EventArgs e)
{
TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
TimeSpan mtimeSpan = new TimeSpan(ctimeSpan.Days, ctimeSpan.Hours, trackBarMinutes.Value, ctimeSpan.Seconds, ctimeSpan.Milliseconds);
ticksDisplayed = mtimeSpan.Ticks;
UpdateTime();
}
private void trackBarSeconds_Scroll(object sender, EventArgs e)
{
TimeSpan ctimeSpan = new TimeSpan(ticksDisplayed);
TimeSpan stimeSpan = new TimeSpan(ctimeSpan.Days, ctimeSpan.Hours, ctimeSpan.Minutes, trackBarSeconds.Value, ctimeSpan.Milliseconds);
ticksDisplayed = stimeSpan.Ticks;
UpdateTime();
}
private void btnPause_Click(object sender, EventArgs e)
{
if (btnStart.Text == "STOP")
{
if (btnPause.Text == "PAUSE")
{
btnPause.Text = "CONTINUE";
watch.Stop();
timer1.Enabled = false;
}
else
{
btnPause.Text = "PAUSE";
watch.Start();
timer1.Enabled = true;
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
UpdateTime();
}
}
}
版中没有这样的问题。
答案 0 :(得分:34)
在阅读以下内容之前,请确保您的表单中包含@csrf
或{{ csrf_field() }}
像
<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>
出现会话过期错误消息是因为您的csrf令牌验证失败的某个地方,这意味着App\Http\Middleware\VerifyCsrfToken::class
中间件已经打开。已经以@csrf
刀片指令的形式添加了,也应该没问题。
然后要检查的另一个区域是会话。 csrf
令牌验证直接与您的会话有关,因此您可能要检查会话驱动程序是否正常工作,例如Redis配置错误可能会引起问题。
也许您可以尝试从.env
文件中切换会话驱动程序/软件,下面提供了受支持的驱动程序
Laravel 5.7中受支持的会话驱动程序 (Doc Link)
file
-会话存储在存储/框架/会话中。 cookie
-会话存储在安全的加密cookie中。database
-会话存储在关系数据库中。 memcached
/ redis
-会话存储在这些基于高速缓存的快速存储区之一中。array
-会话存储在PHP数组中,并且不会保留。如果在切换会话驱动程序后您的表单可以工作,则说明该特定驱动程序有问题,请尝试从此处修复错误。
可能出现错误的情况
基于文件的会话可能由于/storage
目录的权限问题而无法正常工作(快速搜索将为您提供解决方案)
对于数据库驱动程序,您的数据库连接可能错误,或者sessions
表可能不存在或配置错误(根据注释,错误的配置部分被确认为问题。 @Junaid Qadir)。
redis/memcached
配置错误或同时被系统中的其他一些代码操纵。执行php artisan key:generate
并生成一个新的应用程序密钥可能是一个好主意,该应用程序密钥又将刷新会话数据。
清除浏览器缓存 HARD ,我发现chrome和firefox是我不记得的罪魁祸首。
答案 1 :(得分:18)
这是因为表单需要一个csrf。在5.7版中,他们将其更改为@csrf
<form action="" method="post">
@csrf
...
Referene: https://laravel.com/docs/5.7/csrf
答案 2 :(得分:4)
如何使用
{{ csrf_field() }}
而不是@csrf
419错误主要是由于csrf令牌问题。
答案 3 :(得分:4)
要解决此错误,您首先需要在form标签中插入以下命令之一。
@csrf
或{{ csrf_field }}
如果您的问题仍未解决,请执行以下操作:(请注意,以上命令之一必须位于form标记中)
1。将以下命令之一插入form标签
@csrf
或{{ csrf_field }}
2。打开.env文件并将其值更改为SESSION_DRIVER部分中的“文件”。
3。然后您应该重置laravel缓存。在终端中输入以下命令
php artisan view:clear
php artisan route:clear
php artisan cache:clear
php artisan config:cache
4。最后,从服务中拔出项目,然后再次单击php artisan服务
希望您的问题得到解决
答案 4 :(得分:4)
添加csrf令牌,您的问题将得到解决。 {{csrf_token}} 要么 @csrf
答案 5 :(得分:4)
我使用Laravel 5.7 我遇到了同样的问题,这是因为csrf令牌的格式不正确,因此添加
@csrf
解决了问题
答案 6 :(得分:3)
将welcome.blade.php中的@csrf
更改为<input type="hidden" name="_token" value="{{ csrf_token() }}">
所以您的代码是这样的:
<form method="POST" action="/foo" >
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
<button type="submit">Submit</button>
</form>
答案 7 :(得分:3)
情况1:如果您正在本地系统中运行项目,例如 127.0.01:8000,
然后
在您的.env文件中添加SESSION_DOMAIN=
或在您的config / session.php 'domain' => env('SESSION_DOMAIN', ''),
然后运行php artisan cache:clear
情况2:如果项目正在服务器上运行,并且您具有类似的域 “ mydomain.com”
在您的.env文件中添加SESSION_DOMAIN=mydomain.com
或在您的config / session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),
然后运行php artisan cache:clear
答案 8 :(得分:3)
尝试在\App\Http\Middleware\EncryptCookies::class
中注释掉\app\Http\Kernel.php
我有类似的问题,并通过这样做解决了。
可能不是最好的解决方案,因为它具有安全性,但至少可以起作用。
以前我尝试过:
\App\Http\Middleware\VerifyCsrfToken::class
中注释\app\Http\Kernel.php
\Illuminate\Session\Middleware\AuthenticateSession::class
中注释\app\Http\Kernel.php
但是以上这些都不适合我。
答案 9 :(得分:2)
您的会话可能有问题。经过这些设置后,我解决了我的问题。对我来说,这是最后的选择。
来源:Laravel Session always changes every refresh / request in Laravel 5.4
答案 10 :(得分:2)
如果您尝试了所有这些步骤,它将正常工作:
确保您的会话配置正确,最简单的方法是将其设置为文件,并确保存储文件夹具有chmod 755权限,然后在.env
中按如下所示进行设置,文件会话驱动程序即为最简单的设置方法。
SESSION_DRIVER=file
SESSION_DOMAIN=
SESSION_SECURE_COOKIE=false
确保Cache文件夹已清除且可写,您可以通过在artisan命令下运行来实现。
php artisan cache:clear
确保正确设置文件夹权限,它们的配置应如下所示:
sudo chmod -R 755 storage
sudo chmod -R 755 vendor
sudo chmod -R 644 bootstrap/cache
确保您的表单中包含@csrf
令牌。
希望这可以解决您的问题。
答案 11 :(得分:1)
虽然表单中有@csrf
,但仍显示419 pages has expired
我将config / session.php中的SESSION_SECURE_COOKIE
选项更新为false后解决了该问题
'secure' => env('SESSION_SECURE_COOKIE', false)
比清除缓存
答案 12 :(得分:1)
在项目上打开命令行cmd。
1.command
php artisan config:cache
2.com和
php artisan route:clear
答案 13 :(得分:1)
您的应用程序标头中还包含csrf吗?
<meta name="csrf-token" content="{{ csrf_token() }}">
答案 14 :(得分:1)
419 |页面:此错误表示laravel安全问题,这意味着 csrf令牌字段使用不正确。
使用{{csrf_field}}
这样您的问题就会解决。
答案 15 :(得分:1)
默认情况下,我没有这个问题。所以我所做的是chmod -R 644 sessions
复制问题。
然后,我通过chmod -R 755 sessions
现在我的项目代码可以再次使用。
发生这种情况的原因是您将缓存存储在文件中而没有编写 权限。
会话配置文件存储在config / session.php中。是 请务必查看此文件中可用的选项。默认情况下, Laravel配置为使用文件会话驱动程序,它将起作用 非常适合许多应用。在生产应用中,您可能 考虑使用memcached或redis驱动程序以提高会话速度 性能。
解决方案:
1-正如我在上面确定的那样,您可以将755权限授予session文件夹。 2-您可以使用其他会话驱动程序配置。
文件-会话存储在存储/框架/会话中。曲奇饼 - 会话存储在安全的加密cookie中。数据库-会话 存储在关系数据库中。 memcached / redis-会话是 存储在这些快速的基于缓存的存储之一中。数组-会话是 存储在PHP数组中,并且不会持久保存。
记住;如果要使用memcached / redis,则需要在服务器上安装它们,否则docker redis容器必须正在运行。
答案 16 :(得分:1)
转到config / sessions.php
找到行
'secure' => env('SESSION_SECURE_COOKIE', true),
将其更改为false
'secure' => env('SESSION_SECURE_COOKIE', false),
如果此参数设置为TRUE,浏览器将要求您使用HTTPS协议,否则它将不存储会话。由于无效
答案 17 :(得分:1)
我刚经历了整个过程,然后将鼠标悬停在此处以寻求答案。 就我而言,解决方案是清除浏览器历史记录。
答案 18 :(得分:1)
。在那里花了很多时间...
答案 19 :(得分:1)
在您的Http/Kernel.php
尝试评论此行:
\Illuminate\Session\Middleware\AuthenticateSession::class,
在您的Web中间件阵列中
这可能是您问题的根源
答案 20 :(得分:0)
就我而言,删除bootstrap/cache
可以解决问题
答案 21 :(得分:0)
对我来说,一旦会话无效并且用户尝试提交发布请求,就会出现错误。 csrf_token不再有效。因此我通过在Exceptions目录中更改Handler.php来克服它,并尝试捕获像这样的令牌不匹配异常。
渲染功能就是这样
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
然后我将其修改为这样
public function render($request, Exception $exception)
{
if ($exception instanceof \Illuminate\Session\TokenMismatchException){ // <<<=========== the Code
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect('/home')->with('message', 'You page session expired. Please try again');
}
return parent::render($request, $exception);
}
只需选择可以处理令牌刷新操作的路由即可。
答案 22 :(得分:0)
请注意,如果您尝试上载的大小超过发布文件大小限制的大文件,则会收到错误419。 在这种情况下,您可以将upload_max_filesize和post_max_size都增加到合理的数量(例如,根据您的使用情况和资源,1000万或20M),请在此处进行检查: https://stackoverflow.com/a/2184541/2100489
但这可能会导致资源消耗问题,例如带宽和存储空间。作为解决方案,您可以在提交表单之前检查文件大小并显示警告消息。
答案 23 :(得分:0)
像这样在.blade.php
文件{{ csrf_field() }}
或@csrf
上的表格中添加
<form method='POST' action='route("exampleRoute")'>
{{ csrf_field() }} or @csrf
....
....
</form>
答案 24 :(得分:0)
app / Exceptions / Handler.php中的一些代码解决了我的问题。
public function render($request, Exception $exception)
{
if ($exception instanceof Illuminate\Session\TokenMismatchException) {
Artisan::call('cache:clear');
Artisan::call('config:cache');
return Redirect::back();
}
return parent::render($request, $exception);
}
答案 25 :(得分:0)
在我的情况下,另一个管理员用户通过我的管理控制台登录,并且无法使用新的laravel / ui身份验证登录并触发419。
解决方案:
使用隐身标签页打开一个新标签页,然后再次进行测试。
答案 26 :(得分:0)
我尝试了此处提供的所有答案。但是他们都没有在共享主机上为我工作。然而,这里提到的灵魂对我有效How to solve "CSRF Token Mismatch" in Laravel l
答案 27 :(得分:0)
就我而言,在打开嵌入在模态视图中的表单之前,我使用 javascript 清除了所有输入。愚蠢的是,我没有注意到它擦除了 hidden
输入的值,其中包括 csrf
标记。尽管我对 name='_token'
输入的条件有一个例外。当然,我的代码是 splitting
带有下划线的输入名称到数组中。
必须为 hidden
输入设置例外。
答案 28 :(得分:0)
如果您添加了@csrf,那么也会出现错误,请确保您没有阻止 cookie...
点击 Cookies 并允许链接!
答案 29 :(得分:0)
2021 年,我在应用上述所有解决方案时遇到了这个错误,我的每条路由都抛出了 419。我的应用程序在 localhost 上运行良好,但在服务器上运行时为 419。
然后我在修复生产环境中的 .env
文件、.env 中的 remove sanctum variables
并在 config/session.php 中设置 'secure' => env('SESSION_SECURE_COOKIE', null)
时得到了解决方案
答案 30 :(得分:0)
这是我见过几次的问题,通常是在使用 apache
时。
如果在执行的任何文件中的开头 <?php
之前有任何杂散字符或换行符,那么在准备和发送 cookie 之前,Web 服务器会发出这些字符。
这会阻止 cookie 发送到客户端,并且客户端必须在每次请求时启动一个新会话。
不幸的是,唯一的解决方案是查看您创建或修改的每个文件(如果您使用 Git 还不错)并确保 <?php
是每个 php 文件中的第一个字符。
您可以忽略视图文件,因为它们在发送 cookie 之后才会使用。
最有可能的候选对象是控制器、服务提供商和路由文件。
答案 31 :(得分:0)
实际上,SCRF是基于会话的令牌。 将您的路由添加到路由组中,并添加一个控制会话的中间件。
web是laravel中的默认中间件,它可以控制会话请求。
Route::group(array('middleware' => ['web']), function () {
Route::post('/foo', function () {
echo 1;
return;
});
});
答案 32 :(得分:0)
我只是遇到了同样的问题,这完全取决于我的愚蠢。在提交所述表单之前,我已经通过javascript禁用了所有表单字段(而不仅仅是提交按钮)!当然,这导致未提交所有表单元素(包括隐藏的_token
字段),这又引发了419错误!
我希望这可以帮助几个小时的人从头开始抓挠!
答案 33 :(得分:0)
这可能是矫kill过正,但您可以尝试以下方法:
//表单调用命名路由,其中添加了隐藏令牌字段。
<form method="POST" action="{{ route('foo') }}" >
@csrf
<input type="hidden" name="_token" value="{!! csrf_token() !!}">
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
// 命名路线
Route::post('/foo', function () {
return 'bar';
})->name('foo');
//在<head></head>
块中添加:
<meta name="_token" content="{!! csrf_token() !!}" />
我确实在Laravel 5.7上使用Homestead在本地进行了测试,这是使用Laravel Installer 2.0.1全新安装的,并且可以正常工作。您的环境是什么?
理论:我想知道这是否与您的环境中使用{{ }}
对比{!! !!}
的刀片式渲染html标签有关,或者它是如何服务的(例如php artisan serve
)。是什么让我认为line 335
中的/vendor/laravel/framework/src/illuminate/Foundation/helpers.php
应该呈现上面手动键入的同一行。
答案 34 :(得分:0)
我也遇到这样的问题,我发现会话文件被锁定以进行写入。因此,我不知道您是通过vagrant还是Docker之类的工具来运行Laravel,但我建议您尝试更改会话目录(当然还有文件)的权限(在VM中运行Laravel时,您应该更改本地和VM中的权限(例如,通过NFS共享文件时)
赞:
chmod -R 777 storage/framework/sessions
chmod -R 777 storage/logs
我知道,获得777许可是您所能想象的最严重的灾难。但是它们很方便进行故障排除。
为确保我从未忘记这一点,我制作了一个bash脚本。 (之所以叫lalog,只是因为我想清除日志文件并设置权限)
注意:请确保您在会话目录上使用此功能。在config / session.php中,有一个files
密钥与该位置一起声明。就我而言:
<?php
//...........
'files' => storage_path('framework/sessions'),
//...........
位置:/ usr / bin / lalog(这是文件,而不是目录)
在外壳中以lalog
#!/bin/bash
rm -rf /home/username/Projects/x/storage/logs/laravel.log
echo "Laravel log removed"
touch /home/username/Projects/x/storage/logs/laravel.log
echo "Laravel log created"
chmod -R 777 /home/username/Projects/x/storage/
echo "CHMOD 777 on Storage dir"
警告!这将允许所有人进行写访问,因此请谨慎操作! 另外,Laravel的日志文件中可能包含一些有用的信息。 (确保在运行我的bash脚本之前先查看该日志文件)
此外,我知道已经提到过。但是,请务必确保您始终
@csrf
表格应该是这样的
<form method="POST" action="{{ route('login') }}">
@csrf
.......
</form>
答案 35 :(得分:0)
您不能在Laravel 5.6或更高版本上做空回报。 Laravel始终期望返回一个值。 (我从过去的经验中知道)。 这主要与PHP 7如何处理空收益有关。
答案 36 :(得分:0)
您错误地添加了CSRF字段。代替@csrf
,您应该像这样使用csrf_field()
:
<form method="POST" action="/foo" >
{{ csrf_field() }}
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
答案 37 :(得分:0)
代码中没有问题。我已经检查了与您在新安装中编写的代码相同的代码。
表单代码:
<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
web.php
文件代码:
Route::get('/', function () {
return view('welcome');
});
Route::post('/foo', function () {
echo 1;
return;
});
如果您清除浏览器缓存或尝试使用其他浏览器,我认为它将解决。
答案 38 :(得分:0)
一种快速的错误方法是转到app \ http \ middleware \ verifycsrftoken.php并将路由添加到$ except列表中。发帖请求将对CSRF令牌验证无效。
protected $except = [
//
'doLogin.aspx',
'create_coupon',
];
答案 39 :(得分:0)
在我的开发环境中,我遇到了同样的问题。使用http://127.0.0.1:8000
而不是http://localhost:8000
来解决。
答案 40 :(得分:0)
只是把它放在那里,我有同样的问题。在我的本地宅基地上,它可以按预期工作,但是将其推送到开发服务器后,我也收到了会话超时消息。弄清它的环境问题后,我从apache变成了nginx,这奇迹般地使问题消失了。
答案 41 :(得分:0)
我很久以前就遇到了这个问题。我记得它引起了storage/framework/sessions
的许可。您可能需要通过chmod -R 0777 storage/framework/sessions
命令进行更改。它对我有用。
答案 42 :(得分:0)
经过很多时间,我才用这种方式解决了
我的laravel安装路径与配置文件session.php中设置的路径不同
'domain' => env('SESSION_DOMAIN', 'example.com'),
答案 43 :(得分:0)
就我而言,这非常荒谬。将.gateway()
放在路由文件的顶部时,出现错误419。
Collection
然后我将Auth::routes()
移到了路由文件的底部,从而解决了该错误。
Auth::routes();
Route::middleware('auth')->group(function () {
Route::get('/', 'DashboardController@index')->name('dashboard');
});
也许它也可以为您提供帮助。祝你好运。
答案 44 :(得分:0)
我只想说,确保生成了csrf令牌,有时它只是一个空数组,例如如果您不在js查询中生成,则以转发器形式进行。
答案 45 :(得分:0)
如果您已有 csrf 指令,则可能已更改了会话的运行方式。
在config/session.php
中,选中“安全” 字段。如果您的服务器上没有https,则应该为false。
您也可以将SESSION_SECURE_COOKIE=FALSE
放在.env
文件(根目录)上。
答案 46 :(得分:-1)
我遇到了类似的问题,并且找到了解决方案
如果您在回显时回显或从控制器打印某些内容,则会弹出此问题。
因此请确保在控制器返回时不使用echo或print
答案 47 :(得分:-1)
只需更改.env SESSION_DRIVER = cookie
答案 48 :(得分:-4)
<form method="POST" action="{{ url('foo') }}" >
or
composer update or composer install
or
in your Http/Kernel.php comment this line (not recommended)
// \App\Http\Middleware\VerifyCsrfToken::class,