Laravel csrf 令牌在 ajax 上第二次不匹配

Posted

技术标签:

【中文标题】Laravel csrf 令牌在 ajax 上第二次不匹配【英文标题】:Laravel csrf token mismatch on ajax post a second time 【发布时间】:2018-07-10 16:01:01 【问题描述】:

我试图在 laravel 中提交一个 ajax 帖子,但我对表单的 csrf 令牌有一些问题。在我的表单中,如果我在第一次提交表单时满足了我在 ajax 帖子 url 中设置的条件。但是,如果我提交表单并且在第一次尝试时故意使我在 ajax 发布 url 中设置的条件失败,如果我再次提交表单,我会在我的 ajax 错误日志中得到一个令牌不匹配异常。我需要在每个 ajax 帖子中刷新 csrf_token 吗?

下面是我的代码

JS

$(document).on('submit','.registration-form',function(e)
    e.preventDefault();
    var form = $(this);
    var form_url = $(this).attr("action");
    var form_values = $(this).serialize();

    $.ajax(
        url:form_url,
        type:'POST',
        data:form_values,
        dataType: 'json',
        async:false,
        success: function(result)
            console.log(result);
            if(result['status']==true)
                location.href = result['redirect'];
            
            else
                form.find(".form-details").show().html(result['message']);
            
        ,
        error: function(ts) 
            console.log(ts.responseText)
        
    );
);

HTML

<form action=" url('login') " method="POST" class="registration-form">
     csrf_field() 
    <input type="text" name="username" class="input" placeholder="Email">
    <input type="password" name="password" class="input" placeholder="Password">
    <button class="button is-redbox is-flat is-fullwidth">Login</button>
</form>

【问题讨论】:

也许您的csrf_token 每次提交时都会更改?我以前遇到过这个问题。这是由于我的会话没有“坚持”。试试console.log(csrf_token()),每次刷新页面时它应该保持不变。 【参考方案1】:

你确定每次都是用 ajax 发送吗?

data: 
    "_token": " csrf_token() ",

【讨论】:

我尝试为序列化的表单值打印 console.log() 并且 _token 出现了 所以尝试为每个请求尝试重新生成令牌:$request->session()->regenerateToken(); 它有帮助还是你在寻找其他解决方案?【参考方案2】:
      $("#cform")[0].reset();

或者用纯javascript

     document.getElementById("cform").reset();

【讨论】:

【参考方案3】:
 public function regenerateToken()
    session()->regenerate();
    return response()->json([
    'msg'=>'success',
    'token'=>csrf_token()
    ]);
    

   $('#form').submit(funtion(event) 
    event.preventDefault(event);
    // Submit the form using AJAX.
    $.ajax(
    type: 'POST',
    url: form.attr('action'),
    data: formData
    )
    .done(function(response) 
    // Make sure that the formMessages div has the 'success' class.
    if (response.msg === 'success') 
    $('#token').val(response.token);
    console.log($('#token').val());
    
    
    $('input[type="text"],input[type="email"] ,textarea, select').val(''); $(this).trigger('reset');
    
    );

【讨论】:

请添加一些有关您的代码如何回答问题的详细信息。

以上是关于Laravel csrf 令牌在 ajax 上第二次不匹配的主要内容,如果未能解决你的问题,请参考以下文章

用于 AJAX CORS 的 Laravel CSRF 令牌

laravel 5中多个异步ajax请求中的CSRF令牌不匹配错误?

本地主机上 laravel 5.3 中 ajax 发布请求中的 CSRF 令牌不匹配异常

CSRF 令牌在带有 Ajax 请求的 Laravel 5.1 异常处理程序中不起作用

即使包含 CSRF 令牌,Laravel ajax 帖子也无法正常工作

当通过Ajax进行POST时,Laravel 5.6 CSRF令牌失败