首页经验laravel 表单 laravel防止表单重复提交

laravel 表单 laravel防止表单重复提交

圆圆2025-08-03 15:00:57次浏览条评论

解决Laravel中多表单提交419错误:CSRF令牌的正确使用在Laravel应用中,当处理多个表单提交时,特别是当其中一个表单出现“419 | PAGE EXPIRED”错误,而另一个表单正常工作时,这通常是由跨站请求伪造(CSRF)令牌缺失或不匹配引起的。本文将深入探讨 Laravel 的 CSRF 保护机制,解释 419 错误的原因,并提供如何在所有 POST 表单中正确使用集成@csrf指令以确保安全以上提交的专业教程。理解Laravel的CSRF保护机制

laravel框架默认对所有post、put、patch和delete请求强制执行csrf(跨站) 要求csrf 是一种恶意攻击,攻击者诱导用户执行他们不希望的操作,例如更改密码、转账等。为了防止此类攻击,laravel 会为每个用户会话生成一个唯一的 csrf 令牌,并在每个请求中验证此令牌。

当用户提交一个 POST 请求时,Laravel 会检查请求中是否包含有效的 CSRF 令牌。如果网关延迟、无效或与服务器端会话中的令牌不匹配,框架就会触发“419 | 页面EXPIRED”错误,表示页面已过期,实际上是CSRF验证失败。419错误:多表单场景下的常见陷阱

在单个页面包含多个表单,或者通过不同视图文件渲染的多个表单时,开发者可能会遇到一个表单提交生成成功,而另一个表单却报419错误的情况。虽然控制器中的数据处理逻辑可能非常多,但问题的根源往往在于HTML表单本身。

考虑以下场景:一个页面上存在两个独立的表单,分别用于提交不同类型的数据。

例如:

路由配置示例:路由::group([ 'prefix' =gt; 'atribut', 'as' =gt; 'atribut.'], function () { 路由:::group(['prefix' =gt; 'tabHome', 'as' =gt; 'tabHome.'], function () { 路由::get('', [AtributDashboardController::class, 'showTab'])-gt;name('showTab'); // 第一个表单的提交路由::post('addDataFirst', [AtributDashboardController::class, 'addDataFirst'])-gt;name('addDataFirst'); // 第二个表单的提交路由::post('addDataSecond', [AtributDashboardController::class, 'addDataSecond'])-gt;name('addDataSecond'); });});登录后复制

控制器方法示例:use Illuminate\Http\Request; // 引入Request门面class AtributDashboardController extends Controller{ // 假设这里有模型实例的注入或初始化 // public function __construct() // { // $this-gt;inpDataFirst = new InpDataFirst(); // $this-gt;inpDataSecond = new InpDataSecond(); // } public function addDataFirst(Request $request) // 使用依赖注入获取Request实例 { $data = [ 'name' =gt; $request-gt;nameForm, 'address' =gt; $request-gt;addressForm, ]; // $this-gt;inpDataFirst-gt;addData($data); // 假设有的对应数据处理逻辑 return redirect('atribut/tabHome')-gt;with('success', '第一个表单数据添加成功!'); } public function addDataSecond(Request $request) // 使用依赖注入获取实例 { $data = [ 'name' =gt; $request-gt;nameForm, 'address' =gt; $request-gt;addressForm, ];

// $this-gt;inpDataSecond-gt;addData($data); // 假设有对应的数据处理逻辑 return redirect('atribut/tabHome')-gt;with('success', '第二个表单数据添加成功!'); }}登录后复制

在这种结构下,如果第一个表单能够成功提交,而第二个表单却出现419错误,问题几乎可以确定是第二个表单的HTML结构中缺少了CSRF令牌。解决方案:在所有POST表单中添加@csrf指令

Laravel 的 Blade 模板引擎提供了一个简洁的指令@csrf,用于在表单中自动生成一个 CSRF 令牌字段。这是解决 419 错误隐藏最直接有效的方法。

错误的表单示例(缺少 CSRF 令牌):lt;!--第一个表单 - 假设这里包含@csrf所以工作正常 --gt;lt;form action=quot;{{route('atribut.tabHome.addDataFirst') }}quot; method=quot;POST";gt; lt;!-- ... 表单字段 ... --gt; lt;输入类型=quot;textquot;name=quot;nameFormquot;gt; lt;输入类型=quot;textquot; name=quot;addressFormquot;gt; lt;按钮类型=quot;submitquot;gt;提交第一个表单lt;/buttongt;lt;/formgt;lt;!--第二个表单 -缺少@csrf,导致419错误 --gt;lt;表单操作=quot;{{ route('atribut.tabHome.addDataSecond') }}quot;method=quot;POSTquot;gt; lt;!-- ... 表单 ... --gt; lt;输入类型=quot;textquot; name=quot;nameFormquot;gt; lt;输入类型=quot;textquot;name=quot;addressFormquot;gt; lt;按钮type=quot;submitquot;gt;提交第二个表单lt;/buttongt;lt;/formgt;登录后复制

正确的表单示例(添加@csrf指令):

要修复41 9错误,只需在所有使用POST方法的HTML表单内部,邻

以上就是解决Laravel中多表单提交419错误:CSRF令牌的正确使用的详细内容,更多请关注乐哥常识网文章相关!

解决Laravel中
华硕商场官网 asus华硕商城
相关内容
发表评论

游客 回复需填写必要信息