Laravel 5.4发票保存遇TokenMismatchException及HttpException求助
解决Laravel 5.4中的TokenMismatchException和HttpException问题
看起来你遇到的问题主要和CSRF令牌验证以及请求流程有关,我结合你的代码给你几个针对性的解决方案:
1. 移除Cookie中的旧CSRF令牌
你在store方法里把整个请求的输入序列化后存入Cookie,这里面包含了旧的_csrf令牌。虽然你的视图里用{{csrf_field()}}生成了新的令牌,但旧令牌存在Cookie中可能会导致验证冲突。修改store方法,存入Cookie前先移除CSRF字段:
public function store(Request $request) { if ($request->add === 'item') { // 移除CSRF令牌,只保留表单数据 $formData = $request->except('_csrf'); // 用Laravel的Cookie方法设置,更规范 return redirect('addItem')->cookie( 'addInvoiceForm', serialize($formData), 30 * 24 * 60 // 30天有效期 ); } // ... 剩余代码 }
同时在create方法里改用Laravel的Cookie获取方式,代替原生$_COOKIE:
public function create(Request $request) { $banks = Bank::all(); $methods = Payment_method::pluck('name_payment', 'id'); $users = User::pluck('name', 'id'); $items = Item::all(); $vats = Vat::all(); $companies = Company::all('name', 'id'); $numberProform = $this->setNumberProform(); if ($request->hasCookie('addInvoiceForm')) { $previousData = unserialize($request->cookie('addInvoiceForm')); return view('invoice.addInvoice', compact('items', 'companies', 'users', 'vats', 'numberProform', 'methods', 'banks', 'previousData')); } return view('invoice.addInvoice', compact('items', 'companies', 'users', 'vats', 'numberProform', 'methods', 'banks')); }
2. 确保CSRF令牌正确生成且无缓存
检查你的视图中{{csrf_field()}}是否在<form>标签内部,这个方法会自动生成当前会话的有效CSRF令牌。如果你的视图被缓存了,执行以下命令清除视图缓存:
php artisan view:clear
3. 处理刷新页面的HttpException
刷新页面出现HttpException是因为浏览器重新发送了POST请求到saveInvoice路由,此时CSRF令牌可能已经过期或不存在。可以在异常处理器中捕获TokenMismatchException,友好重定向回表单页面:
修改app/Exceptions/Handler.php的render方法:
use Illuminate\Session\TokenMismatchException; public function render($request, Exception $exception) { if ($exception instanceof TokenMismatchException) { // 重定向回表单,保留用户输入(除了CSRF)并显示错误提示 return redirect()->back() ->withErrors(['csrf' => 'Sesja wygasła, proszę wypełnić formularz ponownie.']) ->withInput($request->except('_csrf')); } return parent::render($request, $exception); }
4. 检查会话配置与缓存
确保config/session.php中的配置正确(比如domain和path匹配你的应用),会话驱动(比如file)有足够的写入权限。可以清除会话缓存试试:
php artisan session:clear
这些调整应该能解决你遇到的TokenMismatchException和刷新页面的HttpException问题。
内容的提问来源于stack exchange,提问作者Magda
相关产品推荐
相关产品推荐

