簡體   English   中英

Ajax定期工作。 有時POST請求返回錯誤419

[英]Ajax works periodically. Sometimes POST request return error 419

在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>

當我瀏覽另一個瀏覽器時,一切正常。 如果我通過隱身模式,它也有效。 這可能是因為我登錄管理面板了嗎?

像這樣把你的ajax調用。

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

    }
});

正如我看到你的代碼。 您在請求中傳遞csrf令牌。 您遇到的問題是,您的csrf令牌未被更新。

比方說,當你第一次進入你的頁面時,你沒有重新加載你的頁面,laravel給你csrf令牌,你通過meta提供給ajax。

但是經過一段時間后(laravel方面)。 您的csrf令牌已更新,但您在客戶端沒有更新的令牌。要獲得更新,您需要重新加載頁面。

所以對於這個問題,你需要檢查每當你得到錯誤狀態419,請求新的csrf令牌laravel(通過使新的路由從laravel helper獲取csrf令牌csrf_token()返回到ajax)並更新到你的文件。 並根據您的請求將該令牌發回給laravel。

用於將新令牌更新到您的頁面

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

或者您可以通過重新加載頁面來刷新令牌

在刀片視圖中的元標記中添加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){

            }
    });

我找到了答案,但仍然不明白它是如何工作的,解釋誰理解這一點。 應用程序\\例外\\ 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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM