【问题标题】:Laravel csrf token mismatch on ajax post a second timeLaravel csrf 令牌在 ajax 上第二次不匹配
【发布时间】: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()}}),每次刷新页面时它应该保持不变。

标签: javascript jquery ajax laravel csrf


【解决方案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');
        
        });
    

    【讨论】:

    • 请添加一些有关您的代码如何回答问题的详细信息。
    猜你喜欢
    • 2017-01-25
    • 2020-01-28
    • 2015-12-20
    • 2014-11-04
    • 1970-01-01
    • 2020-07-08
    • 2016-12-10
    • 2016-09-20
    • 2020-01-20
    相关资源
    最近更新 更多