人気のPHP WEBアプリケーションフレームワークLaravelのTips。 (Laravelアプリの初期化)composer create-project laravel/laravel my-app

LaravelでCSRFエラーの時に再読み込みし、エラー画面を表示させずに再読み込みさせる。

● LaravelでCSRFの時にカスタム例外ハンドラでCSRFエラーをキャッチしてリダイレクトする

方針

TokenMismatchException を検知 → 元のURLへリダイレクト → フラッシュメッセージで通知

実装

app/Exceptions/Handler.php

use Illuminate\Session\TokenMismatchException;

public function register(): void
{
    $this->renderable(function (TokenMismatchException $e, $request) {
        return redirect()
            ->back()
            ->withInput($request->except('_token', 'password'))
            ->with('csrf_expired', true);
    });
}

レイアウトファイル(resources/views/layouts/app.blade.php など)

@if (session('csrf_expired'))
    <div class="alert alert-warning">
        セッションが切れたため、ページを自動更新しました。もう一度操作してください。
    </div>
@endif

ポイント

  • withInput() で入力値を保持できる(パスワード系は除外推奨)
  • redirect()->back() でGETリクエストとして元のページに戻るため、トークンが新しく発行される
  • フラッシュメッセージなので1回表示したら消える

back() ではなく特定ページに飛ばしたい場合は redirect()->route('login') 等に変えるだけです。

No.2727
03/11 08:43

edit