2014-03-25 61 views
0

在我的web應用程序中,我使用彈簧安全3.2.x並且我正在進行CSRF驗證。在我的登錄頁面中,我已成功完成此操作。不過裏面,我有一個按鈕,按鈕動作是一個JavaScript在JavaScript POST中發送CSRF令牌給出錯誤

 $('#download').click(function(){ 

      var paramValue = '${params}'; 
      var params = $('#params_').clone() 
      $('<form target="_blank" action="report" method="post"></form>').append(params).appendTo('body').submit().remove(); 

     }); 

裏面寫現在的問題是,當我點擊該按鈕,它提供了以下錯誤

無效CSRF令牌「空」被發現在請求參數'_csrf'或頭部'X-CSRF-TOKEN'上。

我認爲這是因爲它的未能發送CSRF令牌。任何人都可以告訴我如何解決這個問題。

在此先感謝

回答

1

好吧,我的問題是在下面的行我沒有發送像正常形式提交csrf標記。

 $('<form target="_blank" action="report" method="post"></form>').append(params).appendTo('body').submit().remove(); 

所以我做的是我創建了隱藏的領域,並插入它像波紋管。

<script type="text/javascript"> 

    $(document).ready(function() { 
    $('#download').click(function(){     

      var params = $('#params_').clone(); 
      var csrftoken = $("#csrftoken_").clone(); 
      $('<form target="_blank" action="report" method="post"></form>') 
       .append(params) 
       .append(csrftoken) 
       .appendTo('body') 
       .submit() 
       .remove(); 

     }); 
    }); 
</script> 

    <input type='hidden' id='params_' name='params' value='${params}' /> 
    <input type="hidden" id="csrftoken_" name="${_csrf.parameterName}" value="${_csrf.token}" /> 

這個工程....

2

是的,就像你說的那是因爲你的動態創建的窗體不包含有效的CSRF令牌輸入。從Spring Security documentation

$(function() { 
    var token = $("meta[name='_csrf']").attr("content"); 
    var header = $("meta[name='_csrf_header']").attr("content"); 
    $(document).ajaxSend(function(e, xhr, options) { 
    xhr.setRequestHeader(header, token); 
    }); 
}); 

這將需要頭添加到您的Ajax請求。

+0

並沒有工作。我已經添加了這部分 – Ravindu

+0

你在ajax請求頭中看到了這個頭文件嗎? – mesutozer

+0

找到了答案。檢查我給出的答案 – Ravindu