You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:12:40