Laravel 10:通过Auth中间件登录后提交表单的问题
解决方案
方案一:重定向回表单时保留输入值(推荐)
Laravel的会话闪存机制可安全临时存储表单数据,且默认会话数据经过加密,安全性有保障。你可以通过以下步骤实现:
修改
Authenticate中间件
在app/Http/Middleware/Authenticate.php的redirectTo方法中,添加闪存表单输入的逻辑:protected function redirectTo($request) { if (! $request->expectsJson()) { // 闪存当前请求的所有输入数据 $request->session()->flashInput($request->input()); // 记录原请求的URL和方法,用于后续跳转判断 $request->session()->put('previous_request', [ 'url' => $request->fullUrl(), 'method' => $request->method() ]); return route('login'); } }登录成功后重定向回原表单
在app/Http/Controllers/Auth/LoginController.php中重写authenticated方法,指定登录后的跳转目标:protected function authenticated(Request $request, $user) { if ($previousRequest = $request->session()->get('previous_request')) { // 清除会话中存储的请求记录 $request->session()->forget('previous_request'); return redirect()->to($previousRequest['url']); } return redirect()->intended($this->redirectPath()); }表单中回显旧数据
在表单输入框中使用old()方法读取闪存的输入值:<input type="text" name="username" value="{{ old('username') }}">闪存数据仅保留到下一次请求,且Laravel默认加密会话内容,无需担心数据泄露。若涉及敏感信息,建议在表单页面先校验用户登录状态,未登录时引导先登录再填写。
方案二:登录成功后自动提交POST请求
此方案需前端配合临时存储表单数据,适合必须自动提交的场景:
前端暂存表单数据
表单提交前判断用户登录状态,未登录则阻止默认提交,将数据存入localStorage后跳转登录页:document.getElementById('target-form').addEventListener('submit', function(e) { // 此处需根据实际业务判断用户是否已登录 if (!window.isLoggedIn) { e.preventDefault(); // 存储表单数据与提交地址 localStorage.setItem('pending_form', JSON.stringify(Object.fromEntries(new FormData(this)))); localStorage.setItem('form_action', this.action); window.location.href = '/login'; } });登录成功后自动提交
登录完成后,读取本地存储的表单数据,动态构建表单并提交:function handleLoginSuccess() { const formData = localStorage.getItem('pending_form'); const formAction = localStorage.getItem('form_action'); if (formData && formAction) { const form = document.createElement('form'); form.method = 'POST'; form.action = formAction; // 添加CSRF令牌 const csrfToken = document.querySelector('meta[name="csrf-token"]').content; const csrfInput = document.createElement('input'); csrfInput.type = 'hidden'; csrfInput.name = '_token'; csrfInput.value = csrfToken; form.appendChild(csrfInput); // 填充表单字段 const data = JSON.parse(formData); Object.keys(data).forEach(key => { const input = document.createElement('input'); input.type = 'hidden'; input.name = key; input.value = data[key]; form.appendChild(input); }); document.body.appendChild(form); form.submit(); // 清除本地存储数据 localStorage.removeItem('pending_form'); localStorage.removeItem('form_action'); } }注意:此方式将数据存在用户本地,不适合存储敏感信息(如密码、支付信息等),仅用于普通表单场景。
内容的提问来源于stack exchange,提问作者Pascal
相关产品推荐
相关产品推荐

