【问题标题】:Laravel exception handler not trapping TokenMismatchExceptionLaravel 异常处理程序不捕获 TokenMismatchException
【发布时间】:2017-10-07 13:26:07
【问题描述】:

我试图在 Laravel 的 Handler.php 中捕获 TokenMismatchException

当我通过临时从表单中删除令牌来模仿 csrf 令牌异常时,我网站的本地开发版本会显示:

TokenMismatchException in VerifyCsrfToken.php line 68:

但是当我更改 Handler.php 中的 render() 函数来查找异常并处理错误时,它就不起作用了。例如,如果我用下面的代码替换默认代码进行测试,并从表单中获取 csrf 令牌,系统会返回我的“这不是令牌问题”消息,而不是“令牌问题”消息。

public function render($request, Exception $exception)
{
    if($exception instanceof TokenMismatchException) {
      return('token problem');
    }else{
      return('this was not a token problem');
    }
    return parent::render($request, $exception);
}

因此,使用默认代码 Laravel 似乎可以识别 TokenMismatchException,但使用我上面的简单测试代码,它不会。你能解释一下这里发生了什么吗?

【问题讨论】:

  • 根据DisgruntledGoatthis answer 的评论,你在类定义之前有use Illuminate\Session\TokenMismatchException; 吗?
  • 我在搜索过程中看到了 DisgruntledGoat 的答案,但没有实现它,所以它不在当前代码中。现在,通过重新包含 use 语句并按照 Ian 的建议实现 http 响应,我终于可以捕获异常并重定向到另一个页面,告诉用户再试一次,或者我决定什么。这是我使用 Laravel 创建的第一个网站 - 这是来自 CodeIgniter 的学习曲线!

标签: php laravel exception-handling


【解决方案1】:

它可能会崩溃,因为返回期望来自render()\Illuminate\Http\Response

/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{

    if($exception instanceof TokenMismatchException)
        return response()->json('Token mismatch');

    return parent::render($request, $exception);
}

记得为异常使用正确的类

use Illuminate\Session\TokenMismatchException;

【讨论】:

  • 基本上你返回的是一个字符串,而它期望返回一个对象。
  • 我现在明白响应需要是正确的 http 响应,并且您已经创建了一个带有 json 格式字符串的 http 响应。我正在尝试,但仍然得到“不是令牌不匹配”。我在上面的问题中附加了您的代码建议的实现
  • 我创建了一个简单的表单,删除了 csrf_token 字段,然后提交它,它工作正常。尝试转储$exception,看看捕获了什么,可能完全不同。
  • 谢谢伊恩。因为它是一个 json 返回,所以看起来有点乱,但我可以看到第一行包含: Illuminate\\Session\\TokenMismatchException: in \/home\/vagrant\/sites\/
  • @Wittner 听起来越来越像是不是异常的问题,而是应用程序正在抛出另一个异常,您需要dd($exception)并找出正在抛出的异常..跨度>
猜你喜欢
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2014-09-02
  • 2018-06-14
  • 2011-09-16
相关资源
最近更新 更多