在提交表单之前,csrf令牌已过期

时间:2019-10-14 10:01:37

标签: laravel laravel-5

8 我有一个表格,我用过{!! csrf_field()!!} 我有2个选择元素,一个用于州,一个用于城市 当州选择更改ajax发送并给新城市

如果此ajax请求未执行,则没有问题 但是如果ajax请求发送然后提交表单,我们将给出419页过期错误 这是ajax代码

$('#state').change(function () {
    var state_id = $(this).val();
    $.ajax({
        type: 'get',
        url: '/panel/selectCitiesByStateId/' + state_id,
        data: {'nothing': 'nothing'},
        timeout: 25000,
        error: function () {
            alert('sorry error');
        },
        success: function (res) {
            res = JSON.parse(res);
            var entires = Object.entries(res);
            var htmlOptionElements = '';
            for (var i = 0; i < entires.length; i++) {
                var city = entires[i];
                htmlOptionElements += '<option value="' + city[1] + '">' + city[0] + "</option>";
            }
            $('#city_id').html(htmlOptionElements);
        }
    })
});

这是表单的顶部代码

<form action="{{route('admin.job.update',['job'=>$job->slug])}}"
      method="post" enctype="multipart/form-data" id="jobForm">
    {!! csrf_field() !!}
    {!! method_field('patch') !!}

这是选择代码

<div class="col-sm-6">
    <label for="" class="control-label">state*</label>
    <select name="state_id" id="state" class="form-control">
        @foreach($states as $state)
            <option value="{{$state->id}}"
                @if($state->id==@$job->state_id)
                    selected
                @endif
            >{{$state->name}}</option>
        @endforeach
    </select>
</div>
<div class="col-sm-6">
    <label for="" class="control-label">city*</label>
    <select name="city_id" id="city_id" class="form-control">
        @foreach($job->state->cities as $city)
            <option value="{{$city->id}}"
                @if(@$job->city->id==$city->id)
                    selected
                @endif
            >{{$city->name}}</option>
        @endforeach
    </select>
</div>

1 个答案:

答案 0 :(得分:0)

好吧

一个csrf令牌只能使用一次。和由获取请求生成的csrf令牌。

通过获取请求加载表单时,会生成令牌并填充表单csrf字段。

在更改#state时触发ajax时,您正在向系统发送获取请求。这意味着将生成一个新的csrf令牌。

这就是为什么当您发送请求(您已经通过ajax发送get请求)时,出现419错误。

您可以通过向ajax发送针对#state的发布请求来解决此问题,并禁用该路由的csrf检查。

这可以解决您的问题。