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

Laravel控制器外使用UnexpectedValueException和LogicException异常的问题

解决Laravel中JWT异常无法捕获的问题

问题根源

你当前引入的LogicException和UnexpectedValueException是App\Http\Controllers目录下的自定义类,而Firebase JWT库抛出的是其自身命名空间下的异常,导致捕获逻辑完全不匹配,自然无法触发预期的处理代码。


修正步骤

  1. 替换异常类的命名空间
    删掉错误的use语句,改为引入Firebase JWT库自带的异常类:

    use Firebase\JWT\Exceptions\LogicException;
    use Firebase\JWT\Exceptions\UnexpectedValueException;
    
  2. 确保辅助函数正确加载
    在项目根目录的composer.json中,将app/helper.php添加到autoload的files数组里:

    "autoload": {
        "files": [
            "app/helper.php"
        ],
        // ...其他配置
    }
    

    执行composer dump-autoload让配置生效。

  3. 优化Cookie清除逻辑
    原setcookie调用参数不全,补充参数确保Cookie能被彻底清除:

    setcookie('userData', null, -1, '/');
    

修正后的完整代码

<?php

use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Illuminate\Support\Facades\Auth;
use Firebase\JWT\Exceptions\LogicException;
use Firebase\JWT\Exceptions\UnexpectedValueException;

if(!function_exists('validateJWT')){
    function validateJWT($token){
        try{
            JWT::decode($token, new Key(env('JWT_SECRET'), 'HS256'));
        }catch(LogicException | UnexpectedValueException $e){
            setcookie('userData', null, -1, '/');
            Auth::guard('web')->logout();
            session()->invalidate();
            session()->regenerateToken();

            return redirect('/');
        }
    }
}

额外建议

  • 关闭Laravel调试模式(.env中设置APP_DEBUG=false),避免直接暴露错误栈信息给用户;
  • 更规范的做法是将JWT验证逻辑放到自定义中间件中,这符合Laravel的请求处理流程,异常处理和跳转逻辑会更可靠。

内容的提问来源于stack exchange,提问作者cherno304

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:05:00