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>
答案 0 :(得分:0)
好吧
一个csrf令牌只能使用一次。和由获取请求生成的csrf令牌。
通过获取请求加载表单时,会生成令牌并填充表单csrf字段。
在更改#state时触发ajax时,您正在向系统发送获取请求。这意味着将生成一个新的csrf令牌。
这就是为什么当您发送请求(您已经通过ajax发送get请求)时,出现419错误。
您可以通过向ajax发送针对#state的发布请求来解决此问题,并禁用该路由的csrf检查。
这可以解决您的问题。