【问题标题】:how to change "CSRF token mismatch" message?如何更改“CSRF 令牌不匹配”消息?
【发布时间】:2021-02-25 09:04:52
【问题描述】:

我正在使用 larvel 8,并且想在使用 ajax 发布时更改“CSRF 令牌不匹配”的消息。我创建了一个闭包并将其传递给 App\Exceptions\Handler 类的可渲染方法,但出现了预览消息。 这是我的代码:

use Illuminate\Session\TokenMismatchException;
class Handler extends ExceptionHandler
{
    protected $dontReport = [
        //
    ];

    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    public function register()
    {
        $this->renderable(function (TokenMismatchException $e, $request) {
            return $request->expectsJson()
                ? response()->json(['message' => 'A new message...'], 419)
                : redirect()->guest(route('login'));
        });    
    }

【问题讨论】:

  • 这里你使用$request->expectsJson()意味着在ajax中你需要传递标题Accept: application/json

标签: ajax laravel csrf-token


【解决方案1】:

修改网页和 ajax 请求的 TokenMismatchException 错误消息

在应用程序异常处理程序中重载prepareException()方法会更好:

    protected function prepareException(Exception $e)
    {
        if ($e instanceof TokenMismatchException) {
            $e = new HttpException(419, __('exception.csrf_token_mismatch'), $e);
        }

        return parent::prepareException($e);
    }

因此您可以创建翻译文件并通过语言文件修改消息。例如创建resources/lang/en/exception.php,内容如下:

<?php

return [
    'csrf_token_mismatch' => 'CSRF token mismatch. Please, refresh page (CTRL+R) and try again.',
];

【讨论】:

    【解决方案2】:

    感谢所有贡献的人,我找到了解决方案。

    由于 laravel 将 Illuminate\Foundation\Exceptions\Handler 类(Handler 类的父类)的函数 prepareException 中的 TokenMismatchException 更改为 HttpException,我们无法渲染 TokenMismatchException。

    protected function prepareException(Throwable $e)
        {
            if ($e instanceof ModelNotFoundException) {
                $e = new NotFoundHttpException($e->getMessage(), $e);
            } elseif ($e instanceof AuthorizationException) {
                $e = new AccessDeniedHttpException($e->getMessage(), $e);
            } elseif ($e instanceof TokenMismatchException) {
                $e = new HttpException(419, $e->getMessage(), $e);
            } elseif ($e instanceof SuspiciousOperationException) {
                $e = new NotFoundHttpException('Bad hostname provided.', $e);
            } elseif ($e instanceof RecordsNotFoundException) {
                $e = new NotFoundHttpException('Not found.', $e);
            }
    
            return $e;
        }
    

    我修改了我的可渲染方法,现在我可以捕获 TokenMismatchException:

    $this->renderable(function (HttpException $e, $request) {
        if ($e->getPrevious() instanceof TokenMismatchException) {
            return $request->expectsJson()
                ? response()->json(['message' =>'Your new message ...', 419)
                : redirect()->guest(route('login'));
        }
    });
    

    【讨论】:

      【解决方案3】:

      如果您想更改错误消息或发生 CSRF 令牌不匹配时显示的页面

      运行此命令:php artisan vendor:publish --tag=laravel-errors

      它将您的默认(供应商)例外页面发布到resources/views/errors/

      从那里,编辑resources/views/errors/419.blade.php,使用您希望在发生 CSRF 验证错误时显示的 html。

      参考:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

      419 Page Expired (Laravel Framework)
          Used by the Laravel Framework when a CSRF Token is missing or expired.
      

      如果你想让ajax请求绕过CSRF令牌验证

      参考:https://laravel.com/docs/8.x/csrf#csrf-excluding-uris

      编辑您的 VerifyCsrfToken 中间件(位置:app/Http/Middleware/VerifyCsrfToken.php),添加:

      class VerifyCsrfToken extends Middleware
      {
          /**
           * The URIs that should be excluded from CSRF verification.
           *
           * @var array
           */
          protected $except = [
              'stripe/*',
              'http://example.com/foo/bar',
              'http://example.com/foo/*',
          ];
      }
      

      【讨论】:

      • 我使用了 ajax 发布请求。在会话过期之前,一切正常,但此请求一旦过期就会收到消息“CSRF 令牌不匹配”。我想将此信息翻译成另一种语言。由于ajax请求,更改419错误刀片文件没有好处。
      • @HamidRezaValizadeh 翻译见laravel.com/docs/8.x/localization
      猜你喜欢
      • 1970-01-01
      • 2020-10-21
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 2016-12-10
      • 2016-09-20
      • 2017-09-01
      相关资源
      最近更新 更多