【Laravel】CSRFトークンを付けているのに、status419エラー

Laravelでajax通信をする時、セキュリティの観点からCSRFトークンを付けていないとエラーになります。しかし、CSRFトークンを設定しているのに、status419エラーが出た時の話。

現象

通常時は正常に稼働しているんですが、以下のような場合に、status419エラーが出た。

・定期的にAjax通信をするページで、そのページを開きっぱなしにしていた時。
・ページを開いた時に、前回のajax通信が残っている時。
(ブラウザの設定で、立ち上げ時に前回開いていたページを開く設定にしている場合など)

いずれも、以下のようなエラーが出て通信が正常に行われなかった。

Failed to load resource: the server responded with a status of 419 (unknown status)

原因

当然といえば当然ですが、トークンの有効期限が過ぎたのが原因だと思われる。

Laravelのトークンのデフォルトの有効期限は120分。

対策

対策というほどの事ではないですが、419エラーを受け取ったらページをリロードするようにしました。

$.ajax({
    type: "GET",
    url: "request.php",
    data: { 'データ': data },
    dataType: "json",
    scriptCharset: 'utf-8',
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
})
    .then(
        function (param) {
            // 通信後の処理
        },
        function (XMLHttpRequest, textStatus, errorThrown) {
            // トークンエラー処理
            if (XMLHttpRequest.status == '419') {
                // リロード
                location.reload();
            }
        });

あと、メタタグを忘れずに。

<meta name="csrf-token" content="{{ csrf_token() }}">