簡體   English   中英

TokenMismatchException Laravel聯系表

[英]TokenMismatchException Laravel Contact Form

我了解您需要其他問題/答案中發布的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'); 

這是我的Contact Controller的主要公共功能“發送”

public function send(Request $request){

    return response()->json([
        'result' => true,
        'message' => 'success'
    ]);
}

現在的主要目標是將成功的消息返回表單。

...還有誰知道我將如何使用類似的方法將驗證返回到表單?

    $this->validate($request, [
        'name' => 'required',
        'email' => 'required|email',
        'message' => 'required'
    ]);

抱歉,我昨天拿起Laravel,所以我超級菜鳥

Laravel有一個CRSF令牌,要求您將密鑰傳遞給存儲在會話中的POST調用。 如果此令牌不匹配或不存在,它將拒絕該請求。 您可以在此處了解更多信息

怎么修:

        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() }}"

默認情況下,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);

        }

    });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM