我知道您需要在其他问题/答案中发布的csrf_token(),但是如果我从外部服务器拨打无法获取令牌的内容呢?
第一次在Laravel建造任何东西。我只是构建一个简单的ajax联系表单来熟悉它。
这是我的JS(会有一些客户端处理因此我需要单独的值而不是直接序列化它)
$('#contact-form').on('submit', function(e){
e.preventDefault();
$.ajax({
type: 'POST',
url: 'forms/contact.php',
dataType: "json",
data: {
name: encodeURIComponent($("#contact-name").val()),
email: encodeURIComponent($("#contact-email").val()),
phone: encodeURIComponent($("#contact-phone").val()),
subject: encodeURIComponent($("#contact-subject").val()),
message: encodeURIComponent($("#contact-message").val())
},
success: function(data) {
alert(data.message);
}
});
});
这是我的路线(在web.php中)
Route::post('forms/contact.php', 'ContactController@send');
这是我的联系控制器的主要公共功能"发送"
public function send(Request $request){
return response()->json([
'result' => true,
'message' => 'success'
]);
}
现在的主要目标是将成功的消息重新发送回表单。
...并且有人会知道如何使用类似的东西将验证返回到表单中吗?
$this->validate($request, [
'name' => 'required',
'email' => 'required|email',
'message' => 'required'
]);
我道歉,我昨天拿起Laravel,所以我是超级菜鸟
答案 0 :(得分:3)
Laravel有一个CRSF令牌,要求您将密钥传递给存储在会话中的POST调用。如果此令牌不匹配或不存在,它将拒绝该请求。您可以阅读有关此here
的更多信息如何解决:
name: encodeURIComponent($("#contact-name").val()),
email: encodeURIComponent($("#contact-email").val()),
phone: encodeURIComponent($("#contact-phone").val()),
subject: encodeURIComponent($("#contact-subject").val()),
message: encodeURIComponent($("#contact-message").val()),
_token: "{{ csrf_token() }}"
答案 1 :(得分:2)
默认情况下,Laravel会再次保护您的CSRF攻击(使用web
中间件时)。
在此处详细了解:https://laravel.com/docs/5.4/csrf
一种简单的方法是在页面中输出CSRF令牌,然后使用您的Javascript代码获取令牌并将其存储到全局变量中。
在您的邮件html页面模板中:
<script>
window.Laravel = <?php echo json_encode([
'csrfToken' => csrf_token(),
]); ?>
</script>
然后,在标题值X-CSRF-TOKEN
中将其发送到任何帖子,放置和修补请求中。
例如,在使用jQuery ajax的帖子调用中:
$('#contact-form').on('submit', function(e){
e.preventDefault();
$.ajax({
type: 'POST',
beforeSend: function(request) {
request.setRequestHeader("X-CSRF-TOKEN", Laravel.csrfToken);
},
url: 'forms/contact.php',
dataType: "json",
data: {
name: encodeURIComponent($("#contact-name").val()),
email: encodeURIComponent($("#contact-email").val()),
phone: encodeURIComponent($("#contact-phone").val()),
subject: encodeURIComponent($("#contact-subject").val()),
message: encodeURIComponent($("#contact-message").val())
},
success: function(data) {
alert(data.message);
}
});
});