簡體   English   中英

Laravel 4 CSRF表單通過Ajax調用提交

[英]Laravel 4 CSRF form submit through Ajax call

我是Stackoverflow和Laravel 4的新手,我試圖通過jquery ajax提交表單。 我serializeArray()表單並使用json提交它。 在laravel中,在檢查提交的csrf令牌的路徑中,轉到我的控制器進行過程輸入。 當_token輸入與serializeArray()一樣在數組中時,csrf檢查不起作用。 我必須得到_token值並提交作為單獨的ajax數據。 我想知道是否有辦法告訴csrf過濾器哪里運行檢查輸入數組的hte字段_token並使用它? 這是我的代碼:

routes.php文件

Route::post('searchAjax', array('before' => 'csrf', 
                                'uses' => 'SearchController@searchAjax'));

這是我想要讀取數組[0] ['_ token]的地方,但我不知道如何告訴它這樣做。

index.js
    var form = $('#search').serializeArray();
var token = $('#search > input[name="_token"]').val();
$.ajax({
    type: 'post',
    url: 'searchAjax',
    dataType: 'json',
    data: { _token: token, form: form },
    success: function(data) {
        for(var key in data)
        {
            //alert(key)
        }
        //alert(data.message);
    }
});

我想在ajax調用中刪除{_token:token,form:form},並且只有'form',它已經是一個帶有_token的數組。 這是html:

<form id="search" class="form-horizontal" accept-charset="UTF-8" action="http://testing:998/search" method="POST">
  <input type="hidden" value="6GBbv9LmnOdL8UcOsm8DDJ4Bfi6eGcQRlC9SPdL4" name="_token">
<div class="control-group">
  <label class="control-label" for="title">Book Titles</label>
  <div class="controls">
    <input id="title" class="input" type="text" value="click to search book titles" name="title">
  </div>
</div>
<div class="control-group">
<div class="control-group">
<div class="control-group">
</form>

先感謝您。 :)

另一種選擇是使用Kelt Dockins概述的方法,即使用jquery在頭文件中發送令牌,例如。 你的jquery / javascript bootstrapping中的某個地方添加:

$.ajaxSetup({
    headers: {
        'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
    }
});

這將從頭元數據標記中獲取CSRF令牌,並將其包含在每個ajax請求的標頭中。 然后,您需要將元數據和令牌添加到Laravel模板中,例如。

<head>
    <title>My Page</title>
    <meta name="csrf-token" content="<?= csrf_token() ?>">

您還需要修改CSRF過濾器以檢查ajax請求標頭以及默認的Input :: get('_ token')

Route::filter('csrf', function()

{
   $token = Request::ajax() ? Request::header('X-CSRF-Token') : Input::get('_token');
   if (Session::token() != $token) {
      throw new Illuminate\Session\TokenMismatchException;
   }
});

暫無
暫無

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

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