2016-03-30 3 views
0

ノックアウトjsクリックバインディングを使用してボタンをクリックすると、ajaxポストメソッドを介してユーザーフォームを送信しようとしています。受信エラー403 - 禁止されています。CSRFとajaxフォームは、ノックアウトjsクリックバインディングを使用してコードネイター3で送信されます。 - 禁止されたエラー

CSRFとは関係がありますが、それを把握することはできません。

View.php:ボタンをクリックするだけで

<?php echo form_open('client/search_client_database', ['role' => 'form']); ?> 
    <fieldset> 
    <div class="form-group"> 
     <label class="sr-only" for="search_client_input">Search for existing clients</label> 
     <div class="input-group"> 
     <input class="form-control input-sm" type="text" id="search_client_input" name="search_client_input" placeholder="Search for existing clients..."> 
     <span class="input-group-btn"> 
      <button class="btn btn-primary btn-sm" type="button" data-bind="click: search_client">Search</button> 
     </span> 
    </div> 
    </div> 
    </fieldset> 
<?php echo form_close(); ?> 

、ノックアウトのJSクリック結合は、コントローラへのAJAX呼び出しを開始することtriggedされます。ノックアウトjsコードは別のjsファイルにあり、ビューと共にロードされます。

Client.jsファイル:

var base_url = window.location.origin; 
var url = base_url+"/client/"; 

this.search_client = function() 
     {   
      crsf = $("input[name=csrf_test_name]").val(); 
      dataString = $("#search_client_input").val(); 
      alert(crsf); 
      $.ajax({ 
       url: url+"search_client_database", 
       type: "post", 
       cache: false, 
       data: {crsf: crsf, data: dataString}, 
       success: function(customer_details) { 
        alert(customer_details);      
       }, 
       error: function(xhr, ajaxOptions, thrownError) 
       { 
        alert(xhr.status); 
        alert(thrownError); 
       } 
      }); 
     } 

はコントローラー:

public function search_client_database() 
    { 
     $data = $this->input->post('data'); 
     echo $data; 
    } 

私はすなわち禁止XHRエラー403を取得しておきます。 URLに間違いはありません。

+1

:あなたのAjaxリクエストにdataでそれを使用する必要があるので、それは、csrf_test_nameと呼ばれ、あなたのコードに基づいて、あなたの場合は

'$ config ['csrf_token_name']'で設定されています。ですから、 'data:{" csrf_test_name ":crsf、data:dataString}、' – nemesv

答えて

1

$config['csrf_token_name']で設定されているものと同じ名前のcsrfトークンを返送する必要があります。あなたが何であるか、同じ名前でCSRFトークンを返送する必要が

$.ajax({ 
    url: url + "search_client_database", 
    type: "post", 
    cache: false, 
    data: { 
    "csrf_token_name": crsf, 
    data: dataString 
    }, 
    success: function(customer_details) { 
    alert(customer_details); 
    }, 
    error: function(xhr, ajaxOptions, thrownError) { 
    alert(xhr.status); 
    alert(thrownError); 
    } 
}); 
関連する問題