Аякс работает периодически. Иногда POST-запрос возвращает ошибку 419 - PullRequest
0 голосов
/ 02 мая 2019

С помощью Laravel я создаю многоязычный сайт.Когда я переключаю языки с помощью Ajax, иногда я получаю сообщение об ошибке. Javascript код:

$(document).ready(function(){
    $("#LanguageSwitcher").change(function(){
        var locale = $(this).val();
        var _token = $('meta[name="csrf-token"]').attr('content');

        $.ajax({
            url: "/language",
            type: 'POST',
            data: {locale: locale, _token: _token},
            datatype: 'json',
            beforeSend: function () {
                console.log('before send - ' + locale);
            },
            success: function (data) {
                console.log('success');
            },
            error: function (error) {
                console.log(error);
            },
            complete: function (data) {
                    window.location.reload(true);
            }
        });
    });
});

web.php:

Route::post('/language/', array(
    'before' => 'csrf', 
    'uses' => 'LanguageController@changeLanguage' 
));

Контроллер:

class LanguageController extends Controller
{
    public function changeLanguage(Request $request){
        if ($request->ajax()) {
            $request->session()->put('locale', $request->locale);
        }
    }
}

layout.blade.php:

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

        <select id="LanguageSwitcher" class="btn btn-outline-danger">
                <option>...code...</option>
                <option>...code...</option>
                <option>...code...</option>
        </select>

Когда я захожу через другой браузер, все работает.Это также работает, если я иду через режим инкогнито.Может ли это быть из-за того, что я захожу в админку?

Ответы [ 4 ]

0 голосов
/ 02 мая 2019

Я нашел ответ, но так и не понял, как это работает, объясните, кто это понимает. App \ Исключения \ handler.php

public function render($request, Exception $exception)
    {
        // code for updating token when session is expired
        if ($exception instanceof \Illuminate\Session\TokenMismatchException) {            
            return Redirect::back()->withErrors(['session' => 'Sorry, your session seems to have expired. Try Again']);
        }

        return parent::render($request, $exception);
    }
0 голосов
/ 02 мая 2019

Как я видел твой код.Вы передаете токен csrf в своем запросе.проблема, с которой вы сталкиваетесь, в том, что ваш токен csrf не обновляется.

Допустим, вы не перезагружаете свою страницу, при первом входе на страницу laravel выдает токен csrf, который вы предоставляете ajaxчерез meta.

Но через некоторое время на бэкенде (со стороны Laravel).ваш токен csrf обновлен, но вы не обновили его на стороне клиента. Чтобы получить обновленный токен, необходимо перезагрузить страницу.

, поэтому для этой проблемы необходимо проверять всякий раз, когда вы получаете ошибкустатус 419, запросить laravel для нового токена csrf (при создании нового маршрута получите токен csrf от laravel helper csrf_token() return to ajax) и обновите свой файл.и отправьте этот токен Laravel вместе с вашим запросом.

Для обновления нового токена на вашу страницу

document.querySelector('meta[name=csrf-token]').setAttribute('content', res.data.csrf);

или вы можете обновить свой токен, перезагрузив страницу

0 голосов
/ 02 мая 2019

добавьте токен csrf в метатег в вашем блейд-представлении

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

в вашей функции ajax:

  $.ajax({
            url: '/search',
            headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
            type: 'POST',
            dataType: 'json',
            success: function(response) {

            },error:function(err){

            }
    });
0 голосов
/ 02 мая 2019

Поставь свой Ajax-вызов вот так.

req = $.ajax({
    type: "POST",
    url: "/search",
    data: {
        "locale": locale,
        "_token": "{{ csrf_token() }}",
    },
    dataType: "json",
    success: function(msg){

    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...