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 异常处理程序中不起作用