Хорошо, позвольте мне сначала объяснить. Я отправляю запрос PUT с помощью ajax следующим образом:
//ajax function
$(document).on("click", ".question_no", function(){
current_color = rgb2hex($(this).css('background-color'));
q_index = $(this).attr('id').slice(5);
id_team_packet = $("#id_team_packet").val();
// startTimer();
if (current_color != '#ffc966') {
$(this).css('background-color', "#ffc966");
var status = "orange";
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name = "csrf-token"]').attr('content')
}
});
$.ajax({
url: '{{route('peserta.submit.ans.stat')}}',
method: 'put',
data: {q_index, id_team_packet},
success: function(data){
console.info(data)
}
})
}
})
ПРИМЕЧАНИЕ У меня в голове уже есть настройка токена CSRF, которую я также включаю в свою настройку ajax, как вы можете видеть ниже. Отлично работает :). Но как только я защищаю этот маршрут с помощью промежуточного программного обеспечения, например:
//middleware
public function handle($request, Closure $next)
{
if (Auth::user()) {
if (Auth::user()->role == 3) {
return $next($request);
}
if ($request->ajax()) {
return response()->json(['intended_url'=>'/'], 401);
}
return redirect('/');
}
if ($request->ajax()) {
return response()->json(['intended_url'=>'/'], 401);
}
return redirect('/');
}
//web.php
Route::middleware(['participant_only'])->group(function(){
Route::put('/peserta/submit-answer-status', 'PesertaController@submitAnsStat')->name('peserta.submit.ans.stat');
});
Как видите, он принимает только зарегистрированных пользователей с ролью «3». Если пользователь пытается войти в систему, он перенаправляется на '/'. Теперь я также проверяю, использует ли запрос ajax, и я возвращаю сообщение с кодом 401. Но, к сожалению, когда промежуточное ПО применяется, и я его использую, он возвращает эту ошибку:
message
exception Symfony\Component\HttpKernel\Exception\HttpException
file -\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php
line 203
Но если я удалю промежуточное ПО, оно заработает. Не знаю, в чем проблема. О, с другой стороны, если я исключу этот конкретный маршрут из verifycsrftoken, он вернет правильный ответ как с промежуточным программным обеспечением, так и без него.
У меня вопрос: в чем проблема и как ее исправить? Спасибо :)
Богом клянусь, но внезапно это сработало. Не знаю, что я сделал: 0
Я бы поставил $.ajaxSetup вне обработчика кликов. Его нужно вызвать только один раз, и он будет применяться ко всем запросам.





Я избегаю исключать его из csrfverifytoken. Я хочу, чтобы это было безопасно.